题意:外星人族谱长得很奇葩,AP想把它变得好看一些,好看的定义就是每个结点至多有d个parents,如果它本身超过了,就需要增加虚拟结点???来扩展,问最少需要加多少个虚拟结点。

题解:先统计每个孩子的parents个数,如果对于一个外星人,如果它parents个数为m,超过了d,假设要增加k个虚拟结点,那么必须满足m-k*d<=d-k,于是k>=(m-d)/(d-1)

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int tot[100005];
 6 int main()
 7 {
 8     int n,d;
 9     while(scanf("%d%d",&n,&d)!=EOF)
10     {
11         memset(tot,0,sizeof(tot));
12         for(int i=1,t;i<=n;i++)
13         {
14             scanf("%d",&t);
15             tot[t]++;
16         }
17         int cnt=0;
18         for(int i=0;i<=n;i++)
19         {
20             if(tot[i]>d)
21             {
22                 cnt+=(tot[i]-d)/(d-1)+((tot[i]-d)%(d-1)!=0);
23             }
24         }
25         printf("%d\n",cnt);
26     }
27     return 0;
28 }