Codeforces Round #671 (Div. 2)C. Killjoy【思维】

传送门

读了这个题好长时间题意比较难懂
题意:给你两个数n,x,下面是n个数,每次比赛时你可以改变任意多个数的大小但是所有数的变化之和必须为零,在每次比赛前后大小等于x的数都被感染.问:至少需要多少场比赛能把他们全都感染

思路:比赛前可以分为三种情况
1 有n个数和x相等,这样的话比赛前就可以把他们全都感染
2 有1~n-1个数与x相等(已被感染),这样的话我们需要一场比赛把其他不等于x的数变为x,而相反值都加在已经感染的数字上,比赛后把没有感染的感染了就可以了.
3有0个数与x相等,如果n个数的和能整除n且sum/n=x,那么我们只需要一场比赛把它们变成x然后赛后感染就可以,否则的话我们可以先用一场比赛制造1~x个感染者,这样就回到了的二种情况,再来一场比赛即可,答案2

AC code

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<sstream>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    int n,x,a[5000],t;
    cin>>t;
    while(t--)
    {


    cin>>n>>x;
    int s=0,sum=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        if(a[i]==x)s++;
        sum+=a[i];
    }
    if(s==n)printf("0\n");//情况一
       else if(s==0)//情况三
       {
           int q=abs(sum);
           if(q%n==0&&sum/n==x)printf("1\n");
              else printf("2\n");
       }
         else printf("1\n");//情况二
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值