ZOJ 2315

---恢复内容开始---

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 }

---恢复内容结束---

原文地址:https://www.cnblogs.com/Tree-dream/p/5361115.html