2021HAUT_新生周赛lcx专场

Posted lichenx_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021HAUT_新生周赛lcx专场相关的知识,希望对你有一定的参考价值。

题目异常友好。 

有不懂的,直接留言。


目录

卷王之争

纸牌游戏

签到时间

干饭时间

游戏时间

周赛榜单

没有名字

三角图形


卷王之争

比较两个分数大小;

法一:直接通分时要注意数据范围。

#include <iostream>

int main()
{
    long long a , b , x , y ;
    scanf("%d%d%d%d",&a,&b,&x,&y) ;
    a*= y ;
    x*= b ;
    if(a > x)
        printf("H is juanwang!\\n") ;
    else if(a < x)
        printf("T is juanwang!\\n") ;
    else
        printf("We are juanwang!\\n") ;
    return 0;
}

法二:除法计算注意,double不能直接判等号。 

#include <iostream>
#include <algorithm>
#include <cmath>

#define double long double

const double eps = 1e-20 ;

int dcmp(double x,double y){
    if(fabs(x - y ) < eps) return 0 ;
    if(x < y) return -1;
    return 1 ;
}
int main()
{
    double a,  b , x , y ;
    scanf("%d%d%d%d" ,&a ,&b ,&x ,&y) ;
    double s = a/b ;
    double u = x/y ;
    if(dcmp(s,u) > 0)
        printf("H is juanwang!\\n") ;
    else if(dcmp(s,u) < 0)
        printf("T is juanwang!\\n") ;
    else
        printf("We are juanwang!\\n") ;
    return 0 ;
}

纸牌游戏

算是一个简单博弈吧;

例有两种花色的纸牌:

新生第一次取走了第一种纸牌m张,则S学长取走另一种花色m张;

此后不管新生取走哪一种花色的纸牌,也不论取走多少张,S学长都会取走另一种花色的纸牌同样多张;

这样,最后一张纸牌一定是S学长取走的。

拓展到四种花色,也是同样道理。

这样的话,无论如何,结果都是S学长必胜。

#include <stdio.h>

int main()
{
    int n ;
    scanf("%d",&n) ;
    printf("tql\\n") ;
    return 0;
}

签到时间

这是一道简单的高中数学题;

已知:二项式展开式的系数,奇数项之和等于偶数项之和。

选偶数个人,是:

选奇数个人,是:

 则结果为:

二项式展开式得偶数项多一个 ;

则最后结果为 ;

如果,想不起来这个定理的话,建议写几个试试,找规律。

#include <stdio.h>

int main()
{
    int n ;
    scanf("%d",&n) ;
    printf("-1\\n") ;
    return 0;
}

干饭时间

简单贪心;

每次只能去买两种东西,必须在第一种东西做好之前回来;

则,每次选取得两个数字不能相等;

最终结果等于每次选择的两个数字的最大值再加和;

为了最后的时间加和最小,则需要让每两个时间中最小的那个时间值,尽可能的大;

做法:先排序,每次选择两个不同的数,消耗的时间为较大的那个数值;

#include <iostream>
#include <cstdio>

int a[1010], b[1010];

void Sort(int a[], int n)
{
    for (int i = n - 1; i > 0; i--)
        for (int j = 0; j < i; j++)
            if (a[j] > a[j + 1])
            {
                int t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
}

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);
    Sort(a , n);
    int ans = 0;
    for (int i = n - 1; i >= 0; i--)
    {
        if (b[i])
            continue;
        ans += a[i];
        for (int j = i - 1; j >= 0; j--)
        {
            if (!b[j] && a[j] < a[i])
            {
                b[j] = 1;
                break;
            }
        }
    }
    printf("%d\\n", ans);
    return 0;
}

游戏时间

本场最签到题;

每次循环当没有达到目标的话,天数加加,分数增长值加加。

#include <iostream>
#include <cstdio>

int main()
{
    int n , k ;
    scanf("%d%d",&n,&k) ;
    int ans = 0 ;
    int day = 0 ;
    while(ans < n)
        ans += k , k++ , day ++ ;
    printf("%d\\n" , day) ;
    return 0 ;
}

周赛榜单

如果对每个t都过一遍1~n的话,时间复杂度达到了1e12,这样的话时间超限,所以这个题得要先处理一下。

SO,这个只要把前缀和处理一下,这个题就变成了签到题。

例:

原数组:
前缀和 为数组的前项和
前缀和:

前缀和算法能够快速的求出某段区间的和;

出题人说:前缀和更深度的学习看这里

#include <stdio.h>
 
int a[1000010] ;
 
int main()
{
    int n ;
    scanf("%d" , &n) ;
    a[0] = 0 ;
    for(int i = 1 ;i <= n ; i++)
    {
        int x ;
        scanf("%d" , &x) ;
        a[i] = a[i-1]+x ;//a[i]表示前i个人的分数的和
    }
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        int x ;
        scanf("%d" , &x) ;
        printf("%d\\n" , a[x]) ;
    }
    return 0 ;
}

没有名字

简单分支;

依照题意可得,如下:

#include <iostream>
#include <cstdio>

int a[1000010] ;

int main()
{
    int n;
    scanf("%d" ,&n) ;
    int ans = 0 , sum = 0 ;
    while(n--)
    {
        int x , y ;
        scanf("%d%d",&x,&y) ;
        if(x > y)
        {
            if(x==40 && (y==10 || y==20))
                sum += 5 ;
            else
                ans += (x-y) ;
        }
        else
        {
            if(y==40 && (x==10 || x==20))
                ans += 5 ;
            else
                sum += (y-x) ;
        }
    }
    printf("%d %d",ans ,sum) ;
    return 0 ;
}

三角图形

简单模拟;

六根棍子拼出两个三角形。

法一:枚举,枚举每种可能拼成三角形的情况,判断即可;

#include <iostream>
#include <cstdio>

int is_right(int a , int b , int c)
{
    if(c+b > a)
        return 1 ;
    return 0 ;
}

int main()
{
    int a[10] ;
    for(int i = 0 ; i < 6 ; i++)
        scanf("%d", &a[i]) ;
    int flag = 0 ;
    for(int i = 0 ; i < 6 ; i++)
        for(int j = i+1 ; j < 6 ; j++)
            for(int k = j+1 ; k < 6 ; k++)
            {
                int b[5] ;
                int c = 0 ;
                for(int p = 0 ; p < 6 ; p++)
                    if(p != i && p != j && p != k)
                        b[c++] = a[p] ;
                if(is_right(a[i] , a[j] , a[k])==1 && is_right(b[0] , b[1] , b[2])==1)
                {
                    flag = 1 ;
                    break ;
                }
            }
    if(flag == 0)
        printf("No\\n") ;
    else
        printf("Yes\\n") ;
    return 0 ;
}

法二:也是枚举

#include <iostream>
#include <cstdio>

int main()
{
    int a[10] ;
    for(int i = 0 ; i < 6 ; i++)
        scanf("%d", &a[i]) ;
    if(a[5] + a[4] > a[3] && a[2] + a[1] > a[0])
        printf("Yes\\n") ;
    else if(a[5] + a[3] > a[2] && a[4] + a[1] > a[0])
        printf("Yes\\n") ;
    else if(a[5] + a[2] > a[1] && a[4] + a[3] > a[0])
        printf("Yes\\n") ;
    else if(a[5] + a[1] > a[0] && a[4] + a[3] > a[2])
        printf("Yes\\n") ;
    else
        printf("No\\n") ;
    return 0 ;
}

题解简陋,有问题直接提;

以上是关于2021HAUT_新生周赛lcx专场的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 185周周赛 字节专场

ZZNU17级新生周赛第五场(仅限新生参加)

阿里巴巴专场——第322场周赛题解

佳期投资专场——第321场LeetCode周赛题解

LCX端口转发源码分析

LeetCode AutoX 安途智行专场竞赛题解