已AC,但是蒟蒻对自己做法很迷惑
查看原帖
已AC,但是蒟蒻对自己做法很迷惑
753993
daitouzero楼主2023/2/19 21:25
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<set>
#include<vector>
#include<queue>
using namespace std;
int n,k;  
int price[1100],P[1100];
struct Med//药方,a和b配在一起可以得到get
//delta = price[get]-price[a]-price[b]
{
	int a,b;
	int get;
	int delta;
}med[100000];
bool CMP(Med a,Med b)
{
	return a.delta>b.delta;
}
int cnt;
int minans,ans;
vector<int>temp[1100];
int dfs(int pos)
{
	int res=0;
	if (price[pos]==P[pos]) res++;
	bool flag=true;
	for (int i=0,to1,to2,temp1,temp2;i<temp[pos].size();i++)
	{
		to1=med[temp[pos][i]].a;
		to2=med[temp[pos][i]].b;
		if (price[to1]+price[to2]>price[pos]) continue;
		flag=false;
		temp1=dfs(to1);
		temp2=dfs(to2);
		res+=temp1*temp2;
	}
	if (flag) res=1;
	return res;
}
signed main()
{
	cin>>n; 
	for (int i=0;i<n;i++) cin>>price[i],P[i]=price[i];;
	int x,y,z;
	while (cin>>x>>y>>z)
	{
		med[++cnt].a=x;
		med[cnt].b=y;
		med[cnt].get=z;
		med[cnt].delta=price[z]-(price[x]+price[y]);
		temp[z].push_back(cnt);
	}
	minans=price[0];
	bool flag=true; 
	while (1)
	{
		flag=true;
		for (int i=1;i<=cnt;i++)
		{
			if (med[i].delta>0)
			{
				flag=false;
				price[med[i].get]-=med[i].delta;
				for (int j=i+1;j<=cnt;j++)
				{
					med[j].delta=price[med[j].get]-price[med[j].a]-price[med[j].b];
				}
			}
		}
		for (int j=1;j<=cnt;j++)
		{
			med[j].delta=price[med[j].get]-price[med[j].a]-price[med[j].b];
		}
		if (minans>price[0]) minans=price[0];
		if (flag) break;
	}
	ans+=dfs(0);
	cout<<price[0]<<' '<<ans;
	return 0;
}
2023/2/19 21:25
加载中...