按照紫书的思路,递归的方法,自下而上地求出最少地情愿工人书即可,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;
int N, T;
int getResult(vector<int>* person,int ind){
if (person[ind].empty()) return 1;
int amount = (person[ind].size()*T - 1) / 100 + 1;
int result = 0;
vector<int> temp;
for (int i = 0; i < person[ind].size(); i++){
temp.push_back(getResult(person,person[ind][i]));
}
sort(temp.begin(),temp.end());
for (int i = 0; i < amount; i++){
result += temp[i];
}
return result;
}
int main(){
while (cin >> N >> T){
if (N == 0 && T == 0) break;
vector<int>* person = new vector<int>[N+1];
string s;
getline(cin, s);
getline(cin, s);
stringstream is(s);
int id;
int ind = 1;
while (is >> id){
person[id].push_back(ind);
ind++;
}
cout << getResult(person,0) << endl;
}
return 0;
}