제출 #1257415

#제출 시각아이디문제언어결과실행 시간메모리
1257415IcelastSki 2 (JOI24_ski2)C++20
86 / 100
203 ms1888 KiB
#include <iostream> #include <bits/stdc++.h> #define ll long long using namespace std; const ll maxn = 2*1e5+5, INF = 4e15+9; void solve(){ ll n, K; cin >> n >> K; vector<ll> h(n+1), c(n+1); for(int i = 1; i <= n; i++){ cin >> h[i] >> c[i]; } int B = 605; vector<ll> d(B+2, 0), mn(B+2, INF); for(int i = 1; i <= n; i++){ d[h[i]]++; mn[h[i]] = min(mn[h[i]], c[i]); } for(int i = 1; i <= B; i++){ mn[i] = min(mn[i], mn[i-1]); } auto pfmn = [&](int i) -> ll{ if(i == -1) return INF; return mn[i]; }; auto chmin = [&](ll &a, ll b) -> void{ a = min(a, b); }; vector<vector<ll>> f(n+1, vector<ll>(n+1, INF)), prv = f; f[1][d[0]] = 0; for(int i = 0; i < B; i++){ prv = f; for(int j = 0; j <= n; j++){ for(int k = 0; k <= n; k++){ f[j][k] = INF; } } for(int j = 0; j <= n; j++){ for(int k = 0; k <= n; k++){ //prv[j][k] -> f[j][d[i+1] + k-j] + (k-j) * K int c = max(0, k - j); if(d[i+1] + c <= n) chmin(f[j][d[i+1] + c], prv[j][k] + c * K); } } for(int j = 0; j < n; j++){ for(int k = 0; k <= n; k++){ //f[j][k] -> f[j+1][k] + pfmn(i) chmin(f[j+1][k], f[j][k] + pfmn(i)); } } } ll ans = INF; for(int j = 0; j <= n; j++){ ans = min(ans, f[j][0]); } cout << ans; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); solve(); }
#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...