此暴力竟然不对?
查看原帖
此暴力竟然不对?
285856
awdec楼主2020/10/29 17:58
#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
const int N=3e3;
const double eps=1e-5;
double S[N],P[N],R[N];
int son[N];
double f[N][N];
int sum,k,n;
vector<int> p[N];
void add(int u,int v)
{
	p[u].push_back(v); 
}
void dfs(int x)
{
	int i;
	sum+=p[x].size();
	for(i=0;i<p[x].size();i++)
	dfs(p[x][i]);
}
void dp(int x)
{
	int i,j,l;
	for(i=0;i<p[x].size();i++)
	{
		dp(p[x][i]);
		for(j=son[i];j>=0;j--)
		{
			for(l=1;l<=son[p[x][i]];l++)
			{
				if(j>l)
				{
					f[x][j]=max(f[x][j],f[x][j-l]+f[p[x][i]][l]);
				}
			}
		}
	}
}
int main()
{
	int i,j;
	double l=0,r=1e4,mid;
	cin>>k>>n;
	for(i=1;i<=n;i++)
	{
		cin>>S[i]>>P[i]>>R[i];
		add(R[i],i);
	}
	for(i=0;i<=n;i++)
	{
		sum=1;
		dfs(i);
		son[i]=sum;
	}
	while(l+eps<=r)
	{
		mid=(l+r)/2;
		for(i=1;i<=n;i++)
		for(j=1;j<=k;j++)
		f[i][j]=-inf;
		for(i=1;i<=n;i++)
		f[i][1]=P[i]-mid*S[i];
		dp(0);
		if(f[0][k+1]>=eps) l=mid;
		else r=mid; 
	}
	cout<<fixed<<setprecision(3)<<l;
	return 0;
}

2020/10/29 17:58
加载中...