제출 #288801

#제출 시각아이디문제언어결과실행 시간메모리
288801luciocf전선 연결 (IOI17_wiring)C++14
0 / 100
80 ms145344 KiB
#include <bits/stdc++.h> #include "wiring.h" #define ff first #define ss second using namespace std; typedef pair<int, int> pii; typedef long long ll; const int maxn = 210; const ll inf = 1e18+10; int n, m; pii a[maxn]; ll dp[2*maxn][maxn][maxn]; ll solve(int i, int r, int b) { if (i == n+m+1) { if (!r && !b) return 0; return inf; } if (dp[i][r][b] != -1) return dp[i][r][b]; ll ans = inf; if (a[i].ss == 0) { for (int j = 1; r+j <= n; j++) ans = min(ans, solve(i+1, r+j, b) - 1ll*j*a[i].ff); if (b) for (int j = 1; j <= b; j++) ans = min(ans, 1ll*j*a[i].ff + solve(i+1, r, b-j)); } else { for (int j = 1; b+j <= m; j++) ans = min(ans, solve(i+1, r, b+j) - 1ll*j*a[i].ff); if (r) for (int j = 1; j <= r; j++) ans = min(ans, 1ll*j*a[i].ff + solve(i+1, r-j, b)); } return dp[i][r][b] = ans; } ll min_total_length(vector<int> r, vector<int> b) { n = r.size(), m = b.size(); if (n <= 200 && m <= 200) { int aux = 0; for (auto i: r) a[++aux] = {i, 0}; for (auto i: b) a[++aux] = {i, 1}; sort(a+1, a+n+m+1); memset(dp, -1, sizeof dp); return solve(1, 0, 0); } ll ans = 0; if (m > n) { for (int i = m-1; i >= n; i--) ans += 1ll*(b[i]-r[n-1]); for (int i = n-1; i >= 0; i--) ans += 1ll*(b[i]-r[i]); } else if (m < n) { for (int i = 0; i < n-m; i++) ans += 1ll*(b[0]-r[i]); for (int i = n-m; i < n; i++) ans += 1ll*(b[i-(n-m)]-r[i]); } else { for (int i = 0; i < n; i++) ans += 1ll*(b[i]-r[i]); } return ans; }
#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...