CF1526系列

今天个人赛用的题是CF1526系列,同样还是打得不太好。这次又是让B题给搞心态了,感觉最近的B题总是和我作对啊。

Mean Inequality

#include <stdio.h>
#include <algorithm>
using namespace std;
int number[55];
int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=2*n;i++)
            scanf("%d",&number[i]);
        sort(number+1,number+1+2*n);
        for(int i=1;i<n;i++)
            printf("%d %d ",number[i],number[i+n]);
        printf("%d %d\n",number[n],number[2*n]);
    }
    return 0;
}

水题,不多说了。

I Hate 1111

#include <stdio.h>
int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n;
        scanf("%d",&n);
        int m=n%11;
        if(n>=m*111)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

同样是B题,同样又被卡了一个小时,就很气!!!题意很好理解,在这里就不再赘述了。在这里可以发现只有11和111这两个数有用,其它的数都可以由这两个数构成,所以11和111是基数。所以满足题目要求的数一定能用11和111构成,即n=11a+111b。再观察可以发现,111可以由1110+1构成,所以满足题目要求的数对11求余的结果即为b的值,这样一来,只需要判断n是否大于等于111(n%11)即可,大于等于就是YES,小于就是NO。
实际上,大于1099的数肯定都满足题目的要求,即大于1099的数肯定都可以拆成11a+111b的形式,这个结论叫做Chicken McNugget Theorem,CF官方题解是这样写的:
Since gcd(11,111)=1, by the Chicken McNugget Theorem, all numbers greater than 1099 can be written as a sum of 11 and 111. We can use brute force to find the answer to all values less than or equal to 1099 and answer yes for all other numbers.
具体的证明可能要涉及到数论的内容,我也不会,只能说这个结论非常的神奇。

Potions (Easy Version)
Potions (Hard Version)

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
    priority_queue <int,vector <int> ,greater <int> > q;
    int n;
    scanf("%d",&n);
    int ans=0;
    long long sum=0;
    while(n--)
    {
        int number;
        scanf("%d",&number);
        sum+=number,ans++;
        if(number<0)
            q.push(number);
        if(sum<0)
        {
            sum-=q.top();
            q.pop();
            ans--;
        }
    }
    printf("%d\n",ans);
    return 0;
}

这两道题一模一样,只不过一个数据范围较小一个数据范围较大而已,所以相应的,这两道题的解法甚至代码都完全相同。数据范围较小的一道题用dp做也可以,复杂度为O(n^2),但是数据范围较大的那道题就不能用dp来做了,就得用上面优先队列的方法来做,这样一来复杂度就降为了O(nlogn)。刚开始咬定这题是道dp,可后来却发现这题可能是道思维题……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值