Submission #880116

#TimeUsernameProblemLanguageResultExecution timeMemory
880116serifefedartarLet's Win the Election (JOI22_ho_t3)C++17
22 / 100
425 ms652884 KiB
#include <bits/stdc++.h> using namespace std; #define fast ios::sync_with_stdio(0);cin.tie(0); #define s second #define f first typedef long long ll; const ll MOD = 1e9 + 9; const ll LOGN = 21; const ll MAXN = 550; vector<pair<int,int>> v; float dp[MAXN][MAXN][MAXN]; int mn[MAXN][MAXN], N, K; multiset<int> in; void precalc() { for (int i = 1; i < MAXN; i++) { for (int j = 0; j < MAXN; j++) mn[i][j] = 1000000000; } for (int k = 1; k <= K; k++) { in = multiset<int>(); int sum = 0; for (int i = N; i >= 1; i--) { in.insert(v[i].f); sum += v[i].f; if (in.size() > k) { sum -= *prev(in.end()); in.erase(prev(in.end())); } mn[k][i] = sum; } } } int main() { fast cin >> N >> K; v = vector<pair<int,int>>(N); for (int i = 0; i < N; i++) cin >> v[i].f >> v[i].s; sort(v.begin(), v.end(), [&](pair<int,int> a, pair<int,int> b) { if (a.s == -1 && b.s != -1) return false; if (b.s == -1) return true; return (a.s < b.s); }); reverse(v.begin(), v.end()); v.push_back({-1.0, -1.0}); reverse(v.begin(), v.end()); precalc(); for (int i = 0; i < MAXN; i++) { for (int j = 0; j < MAXN; j++) { for (int k = 0; k < MAXN; k++) dp[i][j][k] = 1000000000.0; } } for (int i = 0; i < MAXN; i++) dp[0][0][i] = 0; for (int i = 1; i <= N; i++) { if (v[i].s == -1) continue; for (int exp = 1; exp <= K; exp++) { for (int selected = 0; selected < exp; selected++) { // A kullan if (dp[i-1][selected][exp] + 1.0 * v[i].f / (exp + 1) < dp[i][selected][exp]) dp[i][selected][exp] = dp[i-1][selected][exp] + 1.0 * v[i].f / (exp + 1); // B kullan if (dp[i-1][selected][exp] + 1.0 * v[i].s / (selected + 1) < dp[i][selected+1][exp]) dp[i][selected+1][exp] = dp[i-1][selected][exp] + 1.0 * v[i].s / (selected + 1); } } } double ans = 1000000000.0; for (int i = 0; i <= N; i++) { for (int exp = 0; exp <= K; exp++) { if (dp[i][exp][exp] != 1000000000.0) { int rem_req = K - i; if (rem_req < 0) continue; if (dp[i][exp][exp] + mn[rem_req][i+1] * 1.0 / (exp + 1) < ans) ans = dp[i][exp][exp] + mn[rem_req][i+1] * 1.0 / (exp + 1); } } } cout << setprecision(15) << fixed << ans << "\n"; }

Compilation message (stderr)

Main.cpp: In function 'void precalc()':
Main.cpp:28:18: warning: comparison of integer expressions of different signedness: 'std::multiset<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   28 |    if (in.size() > k) {
      |        ~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...