ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #671 (Div. 2) C. Killjoy

2020-09-21 22:02:21  阅读:240  来源: 互联网

标签:rating account Codeforces accounts each infected Div Killjoy


题目原文

A new agent called Killjoy invented a virus COVID-2069 that infects accounts on Codeforces. Each account has a rating, described by an integer (it can possibly be negative or very large).

Killjoy's account is already infected and has a rating equal to x. Its rating is constant. There are n accounts except hers, numbered from 1 to n. The i-th account's initial rating is ai. Any infected account (initially the only infected account is Killjoy's) instantly infects any uninfected account if their ratings are equal. This can happen at the beginning (before any rating changes) and after each contest. If an account is infected, it can not be healed.

Contests are regularly held on Codeforces. In each contest, any of these n accounts (including infected ones) can participate. Killjoy can't participate. After each contest ratings are changed this way: each participant's rating is changed by an integer, but the sum of all changes must be equal to zero. New ratings can be any integer.

Find out the minimal number of contests needed to infect all accounts. You can choose which accounts will participate in each contest and how the ratings will change.

It can be proven that all accounts can be infected in some finite number of contests.

Input
The first line contains a single integer t (1≤t≤100) — the number of test cases. The next 2t lines contain the descriptions of all test cases.

The first line of each test case contains two integers n and x (2≤n≤103, −4000≤x≤4000) — the number of accounts on Codeforces and the rating of Killjoy's account.

The second line of each test case contains n integers a1,a2,…,an (−4000≤ai≤4000) — the ratings of other accounts.

Output
For each test case output the minimal number of contests needed to infect all accounts.

Example
input

3
2 69
68 70
6 4
4 4 4 4 4 4
9 38
-21 83 50 -59 -77 15 -71 -78 20

output

1
0
2

Note
In the first test case it's possible to make all ratings equal to 69. First account's rating will increase by 1, and second account's rating will decrease by 1, so the sum of all changes will be equal to zero.

In the second test case all accounts will be instantly infected, because all ratings (including Killjoy's account's rating) are equal to 4.


题目大意

给定一个n和x,分别代表n个参加比赛的人数和初始感染者的评分,然后感染规则是:未被感染者的评分与感染者评分一样就会被感染,一个人被感染后就永远处于感染状态。在每一场比赛中参赛者的人数可以随意改变,但总的改变数的代数和必须为0(就是所有人的总和不变),现在要求最少比赛场数使得所有人被感染。


思路

一开始我做的时候一直想着去转化为初始感染者的评分,导致我一直弄不出来。其实在初始感染者感染一些人后可以通过这些人评分的变化再去感染另外的人,那么这道题就可以讨论了:
1.如果所有人的初值都等于x,那么就不用比赛了,因为所有人已经被感染;
2.如果所有人总和的平均值等于x,那么只需要1场比赛就可以让所有人的评分都变为x;
3.如果参赛者中有的初始值等于x,那么这些人在比赛开始前就全部被感染,然后根据被感染者状态不变这个性质,我们可以把剩下的所有未感染者的评分全部变为x,然后这些人的改变数总和全部算在第一批被感染者上面,这样仍然只需1场比赛就可以将所有人全部感染;
4.如果一开始所有参赛者的评分都不等于x,那么我们可以先进行1场比赛,至少可以感染1个,然后根据上面情况3可知再进行一场比赛就可以达到目的,所以总共需要2场比赛


代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[1010];
int main(){
	int t,n;
	ll x;
	scanf("%d",&t);
	while (t--){
		scanf("%d %lld",&n,&x);
		int flag=1,flag2=0;
		ll pos=0,neg=0,sum=0;
		for (int i=0;i<n;i++){
			scanf("%lld",&a[i]);
			if (a[i]!=x)   flag=0;
			if (a[i]==x)   flag2=1;
			sum+=a[i];
		}
		if (flag)   printf("0\n");
		else if (x*n==sum||flag2)   printf("1\n");
		else   printf("2\n");
	}
	return 0;
}

标签:rating,account,Codeforces,accounts,each,infected,Div,Killjoy
来源: https://www.cnblogs.com/FZU221900401/p/13709008.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有