acdream 1212(贪心)

时间:2015-05-07 20:31:06   收藏:0   阅读:178

题意:有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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!