lightoj 1148 Mad Counting
链接:http://lightoj.com/volume_showproblem.php?problem=1148
题意:民意调查,每一名公民都有盟友,问最少人数。
思路:考察的知识点有两个:第一是整数相乘取上整;第二是容器大小(ps:不能算一个知识点,只能算一个坑点)。
做题思路:排序,如果被调查的人有相同盟友人数(n)的个数(cnt)大于这个数+1,即:(cnt > n+1), 容器已满,只能新开辟一个容器来装盟友。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define N 51
using namespace std; int a[N]; int main()
{
int t, ic = , n, i;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i < n; i++)
scanf("%d", a+i);
sort(a, a+n);
int k , ans = , cnt = ;
for(i = ; i < n; i++)
{
if(i == || a[i] == a[i-]) cnt++;
else
{
k = (cnt+a[i-]) / (a[i-]+); //+1 是因为加上自己人数,分子加上a[i-1]是因为取上整
ans += k*(a[i-]+);
cnt = ;
}
}
ans += (cnt+a[n-]) / (a[n-]+) * (a[n-]+); //最后一组没有参加for循环的计算,这里单独算
printf("Case %d: %d\n", ic++, ans);
}
return ;
}