Codeforces Round #634 (Div. 3) ——C. Two Teams Composing题解

题目链接:http://codeforces.com/contest/1335/problem/C

Codeforces Round #634 (Div. 3) ——C. Two Teams Composing题解_第1张图片
Codeforces Round #634 (Div. 3) ——C. Two Teams Composing题解_第2张图片
给定数组,要求从中选取一部分平均分成两组,第一组互不相同,第二组完全相同。

用桶记录每个数出现的次数,并用mx记录最大的那个,另外遍历所有桶,用cnt记录桶里有货的数量。例如(1,1,1,2,3)中1出现的次数最多,mx = 3,一共出现了3个不同的数,cnt = 3

这两个数要比较一下,如果mx = cnt,像上面这个例子,分组的时候只能分成(1,1)和(2,3),所以要减去1。如果mx < cnt或者 mx > cnt,就取较小的那一个,最简单的办法是手写一两个例子。

代码如下:

#include 
using namespace std;
typedef long long ll;
char l[26];
int a[200010] = {
     0};
 
int main() {
     
    int t;
    scanf("%d", &t);
    while(t--) {
     
		int n;
    	scanf("%d", &n);
    	fill(a, a + n + 1, 0);		//注意每次要更新的
    	int x;
    	for(int i = 0; i < n; i++) {
     
    		cin >> x;
    		a[x]++;
		}
		
		int cnt = 0, mx = -1;
		for(int i = 1; i <= n; i++) {
     
			if(a[i] > 0) {
     
				cnt++;
				mx = max(mx, a[i]);
			}
		}
		
		int res = 0;
		if(mx > cnt) {
     
			res = cnt;
		} else if(mx < cnt) {
     
			res = mx;
		} else if(mx == cnt){
     
			res = cnt - 1;
		}
		
		printf("%d\n", res);
	}
 
	return 0;
}

你可能感兴趣的:(CF)