题意分析
对于每个儿子计算一个比例,然后依次向上合并答案
注意比例是直接下属的比例
代码总览
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; ++i)
using namespace std;
const int nmax = 1e6 + 10;
const int INF = 0x3f3f3f3f;
typedef long long ll;
typedef double db;
int n, t;
vector<int> sons[nmax];
int dp(int u) {
if (sons[u].size() == 0) return 1;
vector<int> d;
int k = sons[u].size();
rep(i, 0, k - 1) d.push_back(dp(sons[u][i]));
sort(d.begin(), d.end());
int c = (k * t - 1) / 100 + 1;
int ans = 0;
rep(i, 0, c - 1) ans += d[i];
return ans;
}
int main() {
while(scanf("%d %d", &n, &t) && n != 0){
rep(i,0,n) sons[i].clear();
int temp;
for (int i = 1; i <= n; ++i) {
scanf("%d", &temp);
sons[temp].push_back(i);
}
printf("%d\n", dp(0));
}
return 0;
}