c表示某上司上报的最少请愿下属,k表示总下属
c=0.01T*k=kT/100(0.01T*k是整数)
c=[0.01T*k]+1=[kT/100]+1(0.01T*k不是整数)
kT=100 c=1 kT=101 c=2 因此c=[(kT-1)/100]+1
1 #include<cstdio> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 int n,t,ans; 6 vector<int> child[100010]; 7 int dp(int x) 8 { 9 if(child[x].empty()) return 1; 10 int k=child[x].size(),i; 11 vector<int> temp; 12 for(i=0;i<k;i++) 13 temp.push_back(dp(child[x][i])); 14 sort(temp.begin(),temp.end()); 15 int ans=0,c=(k*t-1)/100+1; 16 for(i=0;i<c;i++) 17 ans+=temp[i]; 18 return ans; 19 } 20 int main() 21 { 22 int i,t2; 23 scanf("%d%d",&n,&t); 24 while(n!=0&&t!=0) 25 { 26 for(i=1;i<=n;i++) 27 { 28 scanf("%d",&t2); 29 child[t2].push_back(i); 30 } 31 ans=dp(0); 32 for(i=0;i<=n;i++) 33 child[i].clear(); 34 printf("%d ",ans); 35 scanf("%d%d",&n,&t); 36 } 37 return 0; 38 }