标签:
题意:有n个人,从1到n,编号越大职位越低,然后给出了第2到第n个人的上司的编号,每个人可以有一堆小弟但只能有一个上司。年底发奖金,每个人可以从上司那得到1000元或发给某个小弟1000元,问所有人能发的奖金和最大是多少,那些人得到了奖金。
题解:直接倒着遍历一遍,把人和他的上司标记掉算作一组,看有几组。
#include <stdio.h>
#include <string.h>
const int N = 500005;
int pa[N], n, flag[N];
int main() {
while (scanf("%d", &n) == 1) {
for (int i = 0; i <= n; i++)
flag[i] = 0;
for (int i = 2; i <= n; i++)
scanf("%d", &pa[i]);
int res = 0;
for (int i = n; i >= 2; i--) {
if (!flag[i] && !flag[pa[i]]) {
flag[i] = 2;
flag[pa[i]] = 1;
res++;
}
}
printf("%d\n", res * 1000);
int temp = 0;
for (int i = 2; i <= n; i++)
if (flag[i] == 2) {
if (!temp) {
printf("%d", i);
temp = 1;
}
else
printf(" %d", i);
}
printf("\n");
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/hyczms/article/details/45565049