ZZuoj1865(贪心)

1865: 统计人数

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 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;
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bokzmm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值