2025-01-17牛客小白月赛AB题解

1.A-Onewan的疑惑

这道题,重要的是读懂题目,然后把这个式子进行合理转化,在题目要求中读取信息为:

  • x为小于等于n的正整数
  • (把19260817移到不等号的右边,左边只剩x,右边我进行了人工计算,得到)
  • x>=n-19375331

所以,我只要找到满足这两条条件的x的个数即可

又因为n的数量级是10的9次方,而long long int的数量级是正负2的63次方-1。所以我们可以使用long long int这个数据类型进行存储数据。

如果使用for循环挨着找的话,时间复杂度太高了所以过不了。

for(int i=1,i<=n;i++)
{
    if(i>=n-19375331)
    {
       count++; 
    }

}

所以我就从数学角度简化做法,我们把n-19375331用x来定义,我发现如果x是一个小于等于0的数,那么本题就转化为了有多少个正整数小于等于n,大于等于x(一个非正数)。很显然有n个。否则的话,就是n-x+1个,如果搞不清楚加不加1,看看测试用例就行了。

#include <stdio.h>
int main()
{
    long long int n=0,i,x;
    scanf("%lld",&n);
    x=n-19375331;
    if(x<=0)
    {
        printf("%lld",n);
    }
    else
    {
        printf("%lld",n-x+1);
    }
    return 0;
}

2.菲菲姐的游戏

  • 易错点:(1)是第一个人在分这个数组,所以对他最有利的分发一定是给自己的数组中所包含的数越多越好,因此我们确定分数组的方法为n-1:1;(2)"至多"为k1和k2,说明了最优策略为平均数找n-1中的最大值,中位数为最后给他剩的那一个数;(3)注意:划分也是属于最优策略的一部分;那么以上就是我们的划分部分(4)至于判断是否存在必胜策略,那只要最后一个数不是最大的话,那“我”一定赢。
  • #include <stdio.h>
    int main()
    {
        int n,k1,k2,i,flag=0;
        int a[10002];
        scanf("%d%d%d",&n,&k1,&k2);
        for(i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        } 
        int temp=a[0];
        int index = 0;
        for(i=1;i<n;i++)
        {
            if(a[i]>temp)
            {
                temp=a[i];
                index = i;
            }
        }
        if(index == n-1)//说明没有必胜策略
            printf("No\n");
        else //说明我一定会赢
            printf("Yes\n");
        return 0;
    }

    思路就是这个思路,但是还是没有通过,所以通过了我再修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值