读了这个题好长时间题意比较难懂
题意:给你两个数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");//情况二
}
}