UVA 12186 工人的请愿书(树形DP)

本题的收获:

每个结点深搜后,可以设置一些条件使之达到对于想要返回的结果。

#include<bits/stdc++.h>

using namespace std;

vector<int> g[100005];
vector<int> d[100005];

bool cmp(int a,int b){
	return a<b;	
}
int T;
int dfs(int u){
	
	if(g[u].empty() && u!=0) return 1;
	
	int ans=0;
	for(int i=0;i<g[u].size();i++){
		int v=g[u][i];
		d[u].push_back(dfs(v));
		
	}
	
	int c=(g[u].size()*T-1)/100+1;
	sort(d[u].begin(),d[u].end(),cmp);
	for(int i=0;i<c;i++)
	ans+=d[u][i];
	
	return ans;
}



int main(){
	int staff,a,sum=0;
	while(scanf("%d %d",&staff,&T) && (staff || T)){
		for(int i=0;i<100005;i++){
			g[i].clear();
			d[i].clear();
		}
		
		for(int i=1;i<=staff;i++){
			scanf("%d",&a);
			g[a].push_back(i);
			
		}
		sum=dfs(0);
		printf("%d\n",sum);
		
	}
		
}

 

发布了57 篇原创文章 · 获赞 58 · 访问量 640

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103633686
今日推荐