POJ 3385

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

你可能感兴趣的:(poj)