题解:CF2023D Many Games
Many Games
题目链接。cnblogs。
Problem
给你
求
数据范围:
Sol
首先
这道题 double 是够用的,long double 可能会比较卡时间。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define fi first
#define se second
mt19937_64 eng(time(0) ^ clock());
template <typename T>
T rnd(T l, T r) { return eng() % (r - l + 1) + l; }
typedef double ld;
int n;
int w[200005];
ld f[300005];
vector<int> p[105];
int main() {
scanf("%d", &n);
for (int i = 1, x; i <= n; ++i) {
scanf("%d%d", &x, w + i);
p[x].emplace_back(w[i]);
}
f[0] = 1;
for (int i = 1; i < 100; ++i) {
sort(p[i].begin(), p[i].end(), greater<int> ());
int lim = ceil(1 / log((ld) 100 / i));
while ((int) p[i].size() > lim)
p[i].pop_back();
for (int j : p[i])
for (int k = 300000; k >= j; --k)
f[k] = max(f[k], f[k - j] * i / 100);
}
ll s = 0;
for (int i : p[100]) s += i;
ld ans = 0;
for (int i = 0; i <= 300000; ++i)
ans = max(ans, f[i] * (i + s));
printf("%.8lf\n", ans);
return 0;
}