SGU195

Problem: New Year Bonus Grant
Description: 微软公司发奖金,规则是这样的。BOSS编号为1,每个员工可以自己拿奖金,也可以把奖金全部给一个下属。也就是说,如果你拿了奖金,那么与你同一个老板的员工和你的下属都不能拿奖金,现在求微软公司最多要付多少奖金。
Solution: 初看这个题是用树形DP,但是其实可以贪心,我们考虑选着中间的员工。如果给他发奖金,那么他的下属们和兄弟们都不能拿奖金,但是如果我们考虑,最下层的员工也就是没有下属的员工,那么就只有他的兄弟们不能拿奖金,这样会比考虑中间的员工奖金多。因此这题我们自下而上考虑。
Code(C++):

#include <stdio.h>
#include <string.h>

const int M=500005;

int p[M];
bool used[M];
int ans[M];
int top;
int n;

int main()
{
    while(~scanf("%d",&n)){
        for(int i=2;i<=n;i++)
            scanf("%d",&p[i]);
        memset(used,false,sizeof(used));
        top=0;
        for(int i=n;i>1;i--)
            if(!used[i]&&!used[p[i]])
                used[i]=used[p[i]]=true,
                ans[top++]=i;
        printf("%d\n",top*1000);
        printf("%d",ans[top-1]);
        for(int i=top-2;i>=0;i--)
            printf(" %d",ans[i]);
        puts("");
    }
    return 0;
}

你可能感兴趣的:(sgu)