题意:外星人族谱长得很奇葩,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 }