#include <cstdio> #include<cstring> #include<algorithm> #include<vector> #include<set> #include<cmath> #define bug(x) printf("**%d\n",x) using namespace std; const int maxn=1e5+10; vector<int> vec[maxn]; int dp[maxn]; int n,T; void init(int n){ memset(dp,-1,sizeof(dp)); for(int i=0;i<=n;i++)vec[i].clear(); } int dfs(int u){ if(vec[u].empty())return 1;//叶子节点 int sz=vec[u].size(); vector<int> s; for(int i=0;i<sz;i++){ s.push_back(dfs(vec[u][i])); } sort(s.begin(),s.end()); int num=ceil((double)sz*(double)T/100.0); int ans=0; for(int i=0;i<num;i++)ans+=s[i]; return dp[u]=ans; } /* 自己感觉用set,简直就是天经地义啊,可忘记了重复,他不会收重复的元素,卧槽, 我是在太sb了 而且还忘了有课这回事,。。。。,真是尴尬 */ int main() { while(scanf("%d %d",&n,&T)==2&&n+T){ init(n); for(int i=1;i<=n;i++){ int u; scanf("%d",&u); vec[u].push_back(i); } int ans=dfs(0); /* for(int i=0;i<=n;i++){ printf("i:%d %d\n",i,dp[i]); } */ printf("%d\n",ans); } return 0; }点击打开题目链接
Another Crisis UVA - 12186
猜你喜欢
转载自blog.csdn.net/qq_36424540/article/details/80279422
今日推荐
周排行