【NOIP2016提高A组模拟9.9】Crisis
2016-09-12 21:35
441 查看
Description
最近几年,一场新的金融危机爆发了,这场危机使得很多人陷入的经济问题的困境。一些X公司的员工试图通过要求加薪度过这一难关。
X公司有着严格的等级制度,除了公司所有者小H以外,其他人都有一个直属上司。没有下属的员工称为工人,其他人则称为领导者。
为了加薪,工人们都会向他们的上司提交请愿书。当然,每个领导者都希望自己的下属能够尽可能快乐的工作,所以当至少有T%的下属提交请愿书时,那么这个领导者就会向自己的上司提交请愿书。计算百分比时,领导者只会计算直属上司是他的下属,当然,他也只会提交一次请愿书。
如果最会小H收到了超过T%的请愿书,那么他将为所有工人们加薪。现在给出公司的构架和T的数值,你需要计算至少有多少工人提交请愿书才能使得小H给工人加薪。
Input
第一行N,T(1≤N≤100000,1≤T≤100)。N表示公司的总人数(不包括小H)。每个员工编号为1到N。小H编号为0 。
第二行有N数,第I个数表示编号的员工直属上司的编号。
Output
一个数,最小需求的工人数。
Sample Input
Cirsis1.in
3 100
0 0 0
Cirsis2.in
3 50
0 0 0
Cirsis3.in
14 60
0 0 1 1 2 2 2 5 7 5 7 5 7 5
Sample Output
Cirsis1.out
3
Cirsis2.out
2
Cirsis3.out
5
Data Constraint
1≤N≤100000,1≤T≤100
最近几年,一场新的金融危机爆发了,这场危机使得很多人陷入的经济问题的困境。一些X公司的员工试图通过要求加薪度过这一难关。
X公司有着严格的等级制度,除了公司所有者小H以外,其他人都有一个直属上司。没有下属的员工称为工人,其他人则称为领导者。
为了加薪,工人们都会向他们的上司提交请愿书。当然,每个领导者都希望自己的下属能够尽可能快乐的工作,所以当至少有T%的下属提交请愿书时,那么这个领导者就会向自己的上司提交请愿书。计算百分比时,领导者只会计算直属上司是他的下属,当然,他也只会提交一次请愿书。
如果最会小H收到了超过T%的请愿书,那么他将为所有工人们加薪。现在给出公司的构架和T的数值,你需要计算至少有多少工人提交请愿书才能使得小H给工人加薪。
Input
第一行N,T(1≤N≤100000,1≤T≤100)。N表示公司的总人数(不包括小H)。每个员工编号为1到N。小H编号为0 。
第二行有N数,第I个数表示编号的员工直属上司的编号。
Output
一个数,最小需求的工人数。
Sample Input
Cirsis1.in
3 100
0 0 0
Cirsis2.in
3 50
0 0 0
Cirsis3.in
14 60
0 0 1 1 2 2 2 5 7 5 7 5 7 5
Sample Output
Cirsis1.out
3
Cirsis2.out
2
Cirsis3.out
5
Data Constraint
1≤N≤100000,1≤T≤100
比赛时の想法
十分明显啊,树形dp,每次在儿子中取代价最小的几个就可以了var a,b:array[0..100005,1..2]of longint; tree,size,cc:array[0..100005]of longint; i,j,k,l,n,t:longint; procedure qsort(l,r:longint); var tmp:array[1..2]of longint; i,j,mid:longint; begin i:=l; j:=r; mid:=a[(i+j) div 2,1]; repeat while a[i,1]<mid do inc(i); while a[j,1]>mid do dec(j); if i<=j then begin tmp:=a[i]; a[i]:=a[j]; a[j]:=tmp; inc(i); dec(j); end; until i>j; if i<r then qsort(i,r); if l<j then qsort(l,j); end; procedure star; begin b[a[1,1],1]:=1; for i:=2 to n do if a[i,1]<>a[i-1,1] then begin b[a[i-1,1],2]:=i-1; b[a[i,1],1]:=i; end; b[a[n,1],2]:=n; end; procedure qsort1(l,r:longint); var i,j,mid:longint; begin i:=l; j:=r; mid:=cc[(i+j) div 2]; repeat while cc[i]<mid do inc(i); while cc[j]>mid do dec(j); if i<=j then begin cc[0]:=cc[i]; cc[i]:=cc[j]; cc[j]:=cc[0]; inc(i); dec(j); end; until i>j; if i<r then qsort1(i,r); if l<j then qsort1(l,j); end; procedure dfs(x:longint); var i,cy:longint; begin if b[x,1]=0 then tree[x]:=1 else begin for i:=b[x,1] to b[x,2] do if i<>0 then dfs(a[i,2]); for i:=b[x,1] to b[x,2] do cc[i-b[x,1]+1]:=tree[a[i,2]]; qsort1(1,size[x]); cy:=0; for i:=1 to size[x] do begin tree[x]:=tree[x]+cc[i]; cy:=cy+1; if (cy*100) div size[x]>=t then break; end; end; end; procedure init; begin readln(n,t); for i:=1 to n do begin a[i,2]:=i; read(a[i,1]); end; readln; qsort(1,n); star; end; begin // assign(input,'t2.in'); reset(input); init; for i:=0 to n do size[i]:=b[i,2]-b[i,1]+1; dfs(0); writeln(tree[0]); // close(input); end.
相关文章推荐
- Crisis【NOIP2016提高A组模拟9.9】
- 【NOIP2016提高A组模拟9.9】运输妹子
- 【JZOJ4770】【NOIP2016提高A组模拟9.9】闭门造车
- 【NOIP2016提高A组模拟9.9】爬山
- 【NOIP2016提高A组模拟9.9】爬山
- 【NOIP2016提高A组模拟9.9】运输妹子
- 【JZOJ4771】【NOIP2016提高A组模拟9.9】爬山
- 【NOIP2016提高A组模拟9.9】闭门造车
- 【NOIP2016提高A组模拟9.9】爬山
- Brothers【NOIP2016提高A组模拟9.9】
- 【JZOJ4772】【NOIP2016提高A组模拟9.9】运输妹子
- 【NOIP2016提高A组模拟9.9】Brothers
- JZOJ4772. 【NOIP2016提高A组模拟9.9】运输妹子
- 【NOIP2016提高A组模拟9.9】运输妹子
- 【NOIP2016提高A组模拟9.9】Word
- 【NOIP2016提高A组模拟9.9】运输妹子
- 【NOIP2016提高A组模拟9.9】闭门造车
- 【NOIP2016提高A组模拟9.9】Brothers
- 【NOIP2016提高A组模拟9.9】总结
- 【NOIP2016提高A组模拟9.15】Math