1865: 统计人数
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 284 Solved: 72
Submit Status Web Board
Description
HS想要统计镇上总共有多少人,但是他并不想一个一个的去数有多少个人,他想了一个其他的方法,他在镇上找了N个人,然后问每一个人“你知道 除你之外 镇上和你姓氏相同的人有多少个吗?”,现在HS想要知道,镇上最少有多少人?我们保证HS不会问同一个人两次。
Input
第一行一个正整数T(T <= 100),表示T组测试样例; 每组样例有两行, 第一行一个正整数N(N <= 50),表示被问到的人数, 第二行N个数(在0 ~ 1000000之间),表示每个人的回答。
Output
每行输出一个正整数,表示镇上最少人数。
Sample Input
241 1 2 210
Sample Output
Case 1: 5Case 2: 1
HINT
//zzuoj1865(贪心)
//题目大意:HS想要统计镇上总共有多少人,但是他并不想一个一个的去数有多少个人,
//他想了一个其他的方法,他在镇上找了N个人,然后问每一个人"你知道除你之外镇上和你姓氏相同的人有多少个吗?
//现在HS想要知道,镇上最少有多少人?我们保证HS不会问同一个人两次。
//解题思路:由于每个人问的都是除了本人外镇上和其姓氏相同的人数.假设回答为k的人数为n,回答k的最少需要k+1个人才能满足上述条件.
//如果n<=k+1,那么可知镇上回答k的人数最少为k+1个,如果n>k+1,则用n除以(k+1),看可以分多少个组,有多少组最少的人数就是多少倍的k+1.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[100];
int main()
{
int t,n,sum,i,j,k,ca=1,v;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
sum=0;
for(i=0;i<n;)
{
k=0;
for(j=i;j<n;j++)
{
if(a[i]==a[j]) k++;
else break;
}
if(k<=(a[i]+1))
sum+=(a[i]+1);
else
{
if(k%(a[i]+1)==0) v=k/(a[i]+1);
else v=k/(a[i]+1)+1;
sum+=v*(a[i]+1);
}
i+=k;
}
printf("Case %d: %d\n",ca++,sum);
}
return 0;
}