这道题是赛时做的,如果没有你谷简明扼要的翻译,的确需要一点时间(英语水平极低)
把
个电池分配给
个孩子,每个孩子手中的种类就是这个孩子的贡献,输出k个数字,第
个代表有
个孩子的最小贡献
为了最小化这个总贡献,每个孩子手中种类尽可能的少,即一个种类的电池尽可能只给一个孩子拿,当孩子人数小于等于电池种类数量的时候,电池种类便是答案
当孩子人数大于电池种类,我们就将一种电池分一份给新的孩子拿,那么第
个答案就是第
个答案加一(观察样例法)
如何统计有多少个不同的数呢,当然是STL——set(其实像排序之类的都可以)
#include <bits/stdc++.h>
using namespace std;
#define T 300100
#define N 300100
#define il inline
#define in(a) a = read()
il int read()
{
int x = 0, v = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-') v = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}
return v * x;
}
void out(int x)
{
if (x < 0) putchar('-'), x = -x;
if (x > 9) out(x / 10);
putchar(x % 10 + '0');
}
int n, m, temp;
set<int> q;
int main()
{
in(n);
for (int i = 0; i < n; i++)
{
in(m);
q.clear();
for (int j = 0; j < m; j++)
{
in(temp);
q.insert(temp);
}
for (int j = 1; j <= m; j++)
{
if (q.size() > j)
out(q.size());
else
out(j);
printf(" ");
}
printf("\n");
}
}