90TLE求助
查看原帖
90TLE求助
124527
leoair楼主2022/2/10 18:12
#include <bits/stdc++.h>
#define N 2510
using namespace std;

int m, n, cnt, s[N], head[N];
double res[N], f[N][N];

struct xcj{
	double cost, fight;
} a[N];

struct xcx{
	int to, nxt;
} e[N];

inline int read(){
	int s = 0, w = 1;
	char ch = getchar();
	for (; ch < '0' || ch > '9'; w *= ch == '-' ? -1 : 1, ch = getchar());
	for (; ch >= '0' && ch <= '9'; s = s * 10 + ch - '0', ch = getchar());
	return s * w;
}

void add(int x, int y){e[++cnt] = {y, head[x]}, head[x] = cnt;}

void dp(int x, int fa){
	s[x] = 1, f[x][1] = res[x];
	for (int i = head[x]; i; i = e[i].nxt){
		int y = e[i].to;
		if (y != fa){
			dp(y, x), s[x] += s[y];
			for (int j = min(m, s[x]); j > 0; --j)
				for (int k = 0; k <= min(j - 1, s[y]); ++k) f[x][j] = max(f[x][j], f[x][j - k] + f[y][k]);//test
		}
	}
}

bool chck(double mid){
	res[0] = 0;
	for (int i = 1; i <= n; ++i) res[i] = a[i].fight - mid * a[i].cost;
	for (int i = 0; i <= n; ++i)
		for (int j = 1; j <= m; ++j) f[i][j] = -1e9;
	dp(0, -1);
	return f[0][m] >= 0;
}

int main(){
	m = read() + 1, n = read();
	for (int i = 1; i <= n; ++i) a[i].cost = read(), a[i].fight = read(), add(read(), i);
	double l = 0, r = 10000;
	while (l < r - 1e-4){
		double mid = (l + r) / 2;
		if (chck(mid)) l = mid;
		else r = mid;
	}
	printf("%.3lf\n", l);
	return 0;
}
2022/2/10 18:12
加载中...