救命 这样写为什么没分啊$QAQ$
查看原帖
救命 这样写为什么没分啊$QAQ$
386890
Kogenta楼主2021/8/24 20:09

一发贪心思路:vector存图,第一遍 dfs 求出每个点为根的子树中点权最大值用来对儿子进行贪心排序(啊就是先给用时久的人送去,再照顾用时短的人),已判回到1号节点才开始装自己家的电脑,过了样例,求大佬帮看看为何全WA

(基本累加答案(时间)的思路就是 记一个缓存时间(temp(temp),就是最久的那个人装机还要剩多久——毕竟在比特安萨尔跑路的时候那些人同时可以修东西,如果发现比当前缓存时间还要长的一个装机时间,答案(总时间ansans)就加上两者差值,缓存时间才变为那个更长的装机时间)

下贴个代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=500050;
int f[maxn],tp[maxn];
vector<int>v[maxn],v1[maxn];
bool p[maxn];
void dfs(int x){
	tp[x]=f[x];
	p[x]=1;
	for(int i=0;i<v[x].size();i++){
		if(p[v[x][i]]) continue;
		v1[x].push_back(v[x][i]);
		dfs(v[x][i]);
		tp[x]=max(tp[v[x][i]],tp[x]);
	}
}
bool cmp(int x,int y){
	return tp[x]>tp[y];
}
int ans,temp;
void dfs2(int x){
	//cout<<"going down to node "<<x<<" with a timeleft : "<<temp<<" (total: "<<ans<<")"<<endl;
	if(x!=1&&temp<f[x]){
		ans+=f[x]-temp;
		temp=f[x];
		//cout<<"renew timeleft to "<<temp<<" (total: "<<ans<<")"<<endl;
	}
	for(int i=0;i<v1[x].size();i++){
		if(temp>0)temp-=1;
		else if(temp==0) ans+=1;
		dfs2(v1[x][i]);
	}
	if(x!=1){
		if(temp>0)temp-=1;
		else if(temp==0) ans+=1;
	}
	return ;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>f[i];
	}
	int x,y;
	for(int i=1;i<n;i++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	dfs(1);
	for(int i=1;i<=n;i++){
		sort(v1[i].begin(),v1[i].end(),cmp);
	}
	ans=0,temp=0;
	dfs2(1);
	cout<<ans+f[1]<<endl;
	return 0;
}
2021/8/24 20:09
加载中...