【gmoj】 【暴力】 【dfs】 Crisis
题目
解题思路
求出这个领导者至少要m个直系下属递申请
dfs出它的直系下属想要递申请需要多少个工人
按需要的工人数排序
累加前m小即为这个领导者想要递申请需要多少个工人
解题思路
#include<iostream>
#include<cstdio>
using namespace std;
struct lzf{
int to,next;
}f[100010];
int n,k,x,t,tot,sum[100010],head[100010];
void add(int x,int y)
{
f[++t].to=y;
f[t].next=head[x];
head[x]=t;
}
int dfs(int x)
{
double z=1.0*sum[x]*k/100;
int m=z,ans=0,len=0;
if (z>m) m++; //需要多少个直系下属递申请
if (!m) return 1; //自己是工人,直接递申请
int b[sum[x]];
for (int i=head[x];i;i=f[i].next)
{
int y=dfs(f[i].to);
b[++len]=y; //求出每个直系下属需要的工人
}
for (int i=1;i<=m;i++)
{
for (int j=i+1;j<=len;j++) //找出第i小
if (b[i]>b[j])
swap(b[i],b[j]);
ans+=b[i]; //累计答案
}
return ans;
}
int main()
{
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
add(x,i);
sum[x]++; //统计直系下属的人数
}
printf("%d\n",dfs(0));
}