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;
}

签到时间

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

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

选偶数个人,是:C_{n}^{2}+C_{n}^{4}+C_{n}^{6}+C_{n}^{8} ...

选奇数个人,是:C_{n}^{1}+C_{n}^{3}+C_{n}^{5}+C_{n}^{7}...

 则结果为:\left \{ C_{n}^{2}+C_{n}^{4}+C_{n}^{6}+C_{n}^{8}... \right \}-\left \{ C_{n}^{1}+C_{n}^{3}+C_{n}^{5}+C_{n}^{7}... \right \}

二项式展开式得偶数项多一个C_{n}^{0} = 1 ;

则最后结果为-1 ;

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

#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,这个只要把前缀和处理一下,这个题就变成了签到题。

例:

原数组: a[1] ,a[2],a[3],a[4],a[5],...,a[n]
前缀和 s[i]为数组的前i项和
前缀和: s[i] = a[1]+a[2]+a[3]+...+a[i-1]+a[i]

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

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

#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 ;
}

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

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值