---恢复内容开始---
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1315
这个题目比较难以看懂,我也是看网上的题目意思才看懂的,大题意思就是关于钱的分配;
一个公司只有一个老板,到了年终的时候,要分钱,分钱有三种限制(老板不可以分红)
一、每个员工可以让的下属拿奖金,可以等待拿自己上司给自己的奖金。也可以什么都不做。
二、每个员工只可以自己拿钱或者给下属分钱,只能选择一样
三、每个员工只能给自己的一个下属分钱;
案例的输入的意思就是
1
4
1 1 2
第一行代表案例数,第二行代表有公司一共有几个人,第三行就是这个员工是属于那一个人管理的,比如说1代表着老板,第3个的2就代表着它是第二个人,也就是现在的所排序的第一个人管理的
1 #include <stdio.h> 2 #include <string.h> 3 4 5 int p[500100]; //记录谁是你的上司 6 bool vis[500100]; //记录是否你分钱了 7 int ans[500100]; //记录分钱了的人的位置 8 9 int main() 10 { 11 int n,i,sum,t; 12 scanf("%d",&t); 13 while(t) 14 { 15 scanf("%d",&n); 16 for(i=2;i<=n;i++) //输入每一个人的直系上司是谁 17 scanf("%d",&p[i]); 18 sum=0; 19 memset(vis,false,sizeof(vis)); //进行初始化,每一个人都还没有进行分钱 20 for(i=n;i>1;i--) 21 { 22 if(!vis[i]&&!vis[p[i]]) //代表这个人没有分到钱,以及他的上司和他上司的其他部下都没有分到钱 23 { 24 vis[i]=true; 25 vis[p[i]]=true; 26 ans[sum++]=i; //记录这个人的位置 27 } 28 } 29 printf("%d ",sum*1000); 30 for(i=sum-1;i>=0;i--) 31 { 32 if(i==sum-1) printf("%d",ans[i]); 33 else printf(" %d",ans[i]); 34 } 35 printf(" "); 36 t--; 37 } 38 return 0; 39 }
---恢复内容结束---