Submission #1281136

#TimeUsernameProblemLanguageResultExecution timeMemory
1281136SmuggingSpunLet's Win the Election (JOI22_ho_t3)C++20
100 / 100
406 ms532 KiB
#include<bits/stdc++.h> #define taskname "c" using namespace std; const int lim = 505; template<class T>void minimize(T& a, T b){ if(a > b){ a = b; } } int n, k, a[lim], b[lim]; namespace sub12{ void solve(){ vector<int>p; for(int i = 1; i <= n; i++){ if(b[i] != -1){ p.push_back(i); } } sort(p.begin(), p.end(), [&] (int i, int j){ return b[i] < b[j]; }); double ans = 0; vector<int>I(n); iota(I.begin(), I.end(), 1); sort(I.begin(), I.end(), [&] (int i, int j){ return a[i] < a[j]; }); for(int i = 0; i < k; i++){ ans += a[I[i]]; } vector<bool>vis(n + 1, false); double sum = 0; for(int i = 0; i < min(int(p.size()), k); i++){ vis[p[i]] = true; sum += double(b[p[i]]) / double(i + 1); double current = 0; int cnt = i + 1; for(int& j : I){ if(cnt == k){ break; } if(!vis[j]){ current += double(a[j]) / double(i + 2); cnt++; } } if(cnt == k){ minimize(ans, current + sum); } } cout << setprecision(9) << fixed << ans; } } namespace sub34{ void solve(){ for(int i = 0; i < n; i++){ a[i] = a[i + 1]; b[i] = b[i + 1]; } double ans = 1e18; for(int mask = 0; mask < (1 << n); mask++){ bool f = true; double current = 0; vector<int>A, B; for(int i = 0; i < n; i++){ if(mask >> i & 1){ A.push_back(a[i]); current += a[i]; } else if(b[i] != -1){ B.push_back(b[i]); } } if(__builtin_popcount(mask) == k){ minimize(ans, current); } sort(A.begin(), A.end()); sort(B.begin(), B.end()); double sum = 0; for(int i = 0; i < min(int(B.size()), k); i++){ sum += double(B[i]) / double(i + 1); if(k - i - 1 <= A.size()){ for(int j = current = 0; j < k - i - 1; j++){ current += double(A[j]) / double(i + 2); } minimize(ans, sum + current); } } } cout << setprecision(9) << fixed << ans; } } namespace sub5{ void solve(){ vector<int>p(n); iota(p.begin(), p.end(), 1); sort(p.begin(), p.end(), [&] (int i, int j){ return a[i] < a[j]; }); double ans = 0; for(int i = 0; i < k; i++){ ans += a[p[i]]; } sort(p.begin(), p.end(), [&] (int i, int j){ return b[i] < b[j]; }); for(int i = 1; i < k; i++){ vector<vector<double>>dp(i + 1, vector<double>(k - i + 1, 1e18)); for(int j = dp[0][0] = 0; j < n; j++){ for(int x = i; x > -1; x--){ for(int y = k - i; y > -1; y--){ if(b[p[j]] != -1 && x > 0){ minimize(dp[x][y], dp[x - 1][y] + double(b[p[j]]) / double(x)); } if(y > 0){ minimize(dp[x][y], dp[x][y - 1] + double(a[p[j]]) / double(i + 1)); } } } } minimize(ans, dp[i][k - i]); } cout << setprecision(9) << fixed << ans; } } namespace sub67{ void solve(){ vector<int>p(n); iota(p.begin(), p.end(), 1); for(int i = 1; i <= n; i++){ if(b[i] == -1){ b[i] = 2e9; } } sort(p.begin(), p.end(), [&] (int i, int j){ return b[i] < b[j] || (b[i] == b[j] && a[i] < a[j]); }); double ans = 1e18; for(int i = 0; i < k; i++){ vector<double>dp(n + 1, 1e18); for(int x = dp[0] = 0; x <= n; x++){ vector<double>ndp(n + 1, 1e18); for(int y = 0; y <= x; y++){ int yy = min(i, x - y); if(yy + y == k && yy == i){ minimize(ans, dp[y]); } if(x < n){ minimize(ndp[y + 1], dp[y] + double(a[p[x]]) / double(i + 1)); minimize(ndp[y], dp[y] + (yy == i ? 0 : double(b[p[x]]) / double(yy + 1))); } } swap(dp, ndp); } } cout << setprecision(9) << fixed << ans; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(taskname".inp", "r")){ freopen(taskname".inp", "r", stdin); } cin >> n >> k; bool is_sub12 = true; for(int i = 1; i <= n; i++){ cin >> a[i] >> b[i]; if(b[i] != -1 && a[i] != b[i]){ is_sub12 = false; } } if(is_sub12){ sub12::solve(); } else if(n <= 20){ sub34::solve(); } else if(n <= 100){ sub5::solve(); } else{ sub67::solve(); } }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:162:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  162 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...