42分求助
查看原帖
42分求助
382274
暗影之梦楼主2022/8/18 08:41

思路二分答案,后面几个点WA。感觉错误有点像缺精度,但是有一个点输出差了37

代码如下:

#include<iostream>
#include<cstdio>
#define int long long
#define double long double
using namespace std;
int n,k[1001],head[2001],cnt,root;
bool rt[1001];
double ll[1001];
struct edge
{
	int to,nxt,w,sp;
}e[2001];
void addedge(int u,int v,int w,int spe)
{
	e[++cnt].to=v;
	e[cnt].w=w;
	e[cnt].sp=spe;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
inline void dfs(int u,double l)
{
	for(int i=head[u];i;i=e[i].nxt)
	{
//		cout<<(double)(l)/(double)100<<endl;
		ll[e[i].to]=(double)(l)/100*(double)e[i].w;
		if(e[i].sp&&ll[e[i].to]>(double)1) ll[e[i].to]*=ll[e[i].to];
//		cout<<e[i].to<<" "<<ll[e[i].to]<<endl;
		dfs(e[i].to,ll[e[i].to]);
	}
}
bool check(double l)
{
	dfs(root,l);
	ll[root]=l;
	for(int i=1;i<=n;i++)
	{
//		cout<<ll[i]<<" g "<<k[i]<<endl;
		if(ll[i]<k[i]) return 1;
	}
	return 0;
}
signed main()
{
	scanf("%lld",&n);
	for(int i=1;i<n;i++)
	{
		int a,b,x,t;
		scanf("%lld%lld%lld%lld",&a,&b,&x,&t);
		rt[b]=1;
		addedge(a,b,x,t);
	}
	for(int i=1;i<=n;i++) scanf("%lld",&k[i]);
	for(int i=1;i<=n;i++)
	{
		if(!rt[i]) root=i;
	}
	double l=(double)1,r=(double)2000000000;
	while(l<r)
	{
		double mid=(double)(l+r+0.00001)/2;
//		cout<<mid<<endl;
		if(check(mid)) l=mid;
		else r=mid-(double)0.00001;
	}
	cout<<l;
	return 0;
} 
2022/8/18 08:41
加载中...