无法通过样例的AC
查看原帖
无法通过样例的AC
965685
yyrwlj楼主2025/1/3 20:00

代码如下,本地和洛谷IDE都是0.002

#include <iostream>
#include <set>
#include <random>
#include <map>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>
#define lowbit(o) o & -o
#define pb push_back
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 2505;
const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const LL INF = 2e18;
vector<int> g[N];
int siz[N], f[N][N], s[N], p[N], n, k;
double mid;
void dfs(int u,int fa)
{
	siz[u] = 1;
	f[u][0] = 0;
	f[u][1] = p[u] - s[u] * mid;
	for (int i : g[u])
	{
		if (i == fa)
			continue;
		dfs(i, u);
		siz[u] += siz[i];
		for (int j=min(k, siz[u]);j;j--)
			for (int v=0;v<=min(j-1,siz[i]);v++)
				f[u][j] = max(f[u][j], f[u][j - v] + f[i][v]);
	}
}
bool check()
{
	memset(f, -0x3f, sizeof f);
	dfs(0, 0);
	return f[0][k] >= 0;
}
void work()
{
    cin>>k>>n;
	for (int i=1;i<=n;i++)
	{
		int fa;
		cin>>s[i]>>p[i]>>fa;
		g[fa].pb(i);
	}
	k ++;
	const double eps = 1e-6;
	double l = 0, r = 1e4;
	while (r - l > eps)
	{
		mid = (l + r) / 2;
		if (check())
			l = mid;
		else
			r = mid;
	}
	printf("%.3lf", l);
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int _T = 1;
    //cin >> _T;
    while (_T--)
    	work();
    return 0;
}

没发现这题有SPJ啊

2025/1/3 20:00
加载中...