3WA+7RE求助
查看原帖
3WA+7RE求助
479246
封禁用户楼主2022/5/10 17:22

rt,有没有dalao救救我/kk

#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<ctime>
#include<cmath>
#include<cctype>
#include<bitset>
#include<vector>
#include<cstdio>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#define eps 1e-4
#define INF 0x3f3f3f3f
#define N 2510
using namespace std;
int n,k,x,tot,cnt,ind[N],Size[N],s[N],p[N],r[N];
double dis[N],f[N][N];
vector<int>G[N];
double max(double x,double y){return x>y?x:y;}
int read(){
	int x=0,f=1,ch=getchar();
	for(;ch<'0' || ch>'9';ch=getchar()) f=(ch=='-')?-1:1;
	for(;ch>='0' && ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
	return x*f;
}
void add_edge(int x,int y){
	G[x].push_back(y);
	G[y].push_back(x);
}
void init(){
	k=read(),n=read();
	for(int i=1;i<=n;++i){
		s[i]=read(),p[i]=read(),r[i]=read();
		add_edge(r[i],i);
		add_edge(i,r[i]);
	}
}
inline void dfs(int x,int f){
	ind[++cnt]=x;
	Size[x]=1;
	for(int i=0;i<G[x].size();++i){
		int y=G[x][i];
		if(y==f) continue;
		dfs(y,x);
		Size[x]+=Size[y];
	}
}
bool check(double x){
	int nn=n+1,kk=k+1;
	for(int i=1;i<=nn+1;++i){
		for(int j=1;j<=kk;++j){
			f[i][j]=-INF;
		}
	}
	for(int i=1;i<=n;++i) dis[i]=(double)p[i]-x*s[i];
	for(int i=nn;i>=1;--i){
		for(int j=1;j<=kk;++j){
			f[i][j]=max(f[i][j],f[i+1][j-1]+dis[ind[i]]);
			f[i][j]=max(f[i][j],f[i+Size[ind[i]]][j-1]+dis[ind[i]]);
			f[i][j]=max(f[i][j],f[i+Size[ind[i]]][j]);
		}
	}
	if(f[1][kk]>0) return true;
	return false;
}
void solve(){
	dfs(0,0);
	double l=0.0,r=1e8;
	while(r-l>eps){
//		printf("l:%.3lf r:%.3lf\n",l,r);
		double mid=(l+r)/2;
//		printf("%d\n",check(mid));
		if(check(mid)) l=mid;
		else r=mid;
	}
	printf("%.3lf",l);
}
int main(){
	init();
	solve();
	return 0;
}
2022/5/10 17:22
加载中...