SGU 195. New Year Bonus Grant (贪心)

SGU195 题意比较难懂。 大致意思就是在一颗树形的关系里面。

•Mocrosoft software这个公司有N个员工。除了老板(BillHates)以外,其他每个人都有一个自己的上司。现在过年了,老板打算给员工们发奖金。为了让支出最少,现在有三个规则:

·Eachprogrammer may either assign a grant to one of his subordinates or have a grantassigned to him by his chief or none of the above. 一、**每个员工可以安排自己的下属拿奖金,可以等待拿自己上司给自己的奖金。也可以什么都不做。(就是说 他给下属安排奖金后,他就不能有奖金了) ·Noprogrammer can simultaneously receive a grant and assign a grant to one of hissubordinates. 二、没有哪一个程序猿可以同时接收上司给的奖金,还给自己下属安排奖金。 (就是说他给下属安排奖金后,他就不能由奖金了!) ·Noprogrammer can assign a grant to more than one of his subordinates 三、每个程序猿最多只能给自己的一个下属(要是他有下属的话)安排奖金。** 注意1是不能选的。 贪心从底下一层开始选择。

195. New Year Bonus Grant

time limit per test: 0.75 sec. memory limit per test: 65536 KB

input: standard output: standard

All programmers of Mocrosoft software company are organized in a strict subordination hierarchy. Every programmer has exactly one chief, except Bill Hates who is also the head of the company and has no chief. Due to the celebration of the new 2003 year, chief accountant of Mocrosoft decided to pay a New Year Bonus Grant of 1000 dollars to some programmers. However being extremely concerned of the company wealth she would like to designate the least possible amount of money for these grants. On the other hand she didn’t want to be accused of being too greedy or of giving preferences to some programmers. To do this, she developed the following scheme of grants appointment:

  • Each programmer may either assign a grant to one of his subordinates or have a grant assigned to him by his chief or none of the above.
  • No programmer can simultaneously receive a grant and assign a grant to one of his subordinates.
  • No programmer can assign a grant to more than one of his subordinates

The scheme seemed to be designed perfectly — nobody would like to assign a grant to anybody since in this case he himself would not receive money. But programmers somehow discovered the plan of chief accountant and decided to make a trick to get the most money possible and share them fairly afterwards. The idea was to make such grant assignments that the total amount of grant money received is maximum possible. You were selected to write the program which will find the optimal grants appointment.

Input

The first line of the input file contains integer N — the number of programmers in Mocrosoft company (2 ≤ N ≤ 500 000). Each programmer is assigned his unique identifier — integer number ranging from 1 to N. Bill Hates has number 1 and each programmer has the number greater then the number of his chief. The second line of the input file contains N-1 integers, i-th of which being the number of the chief of the worker whose number is (i + 1).

Output

On the first line of the output file print the maximum possible amount of money workers can get. On the second line output the numbers of programmers that will receive grant in ascending order.

Sample test(s)

Input

4 1 1 2

Output

2000 3 4

/* ***
Author :kuangbin
Created Time :2014/11/28 18:42:49
File Name :E:\2014ACM\SGU\SGU195.cpp
************************************************ */

#include <stdio.h>

#include <string.h>

#include

#include

#include

#include

#include

#include

#include

#include <math.h>

#include <stdlib.h>

#include <time.h>
using namespace std;
const int MAXN = 500010;
int fa[MAXN];
bool vis[MAXN];

int main()
{
//freopen(“in.txt”,”r”,stdin);
//freopen(“out.txt”,”w”,stdout);
int n;
while(scanf(“%d”,&n) == 1){
fa[1] = 1;
for(int i = 2;i <= n;i++){
scanf(“%d”,&fa[i]);
}
vectorans;
memset(vis,false,sizeof(vis));
for(int i = n;i > 1;i–){
int u = i;
if(vis[u] || vis[fa[u]])continue;
ans.push_back(u);
vis[u] = true;
vis[fa[u]] = true;
}
sort(ans.begin(),ans.end());
int sz = ans.size();
printf(“%d\n”,sz*1000);
for(int i = 0;i < sz;i++){
printf(“%d”,ans[i]);
if(i < sz-1)printf(“ “);
else printf(“\n”);
}
}
return 0;
}

------ 本文结束------
  • 本文作者: kuangbin
  • 本文链接: 521.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
0%