제출 #1124150

#제출 시각아이디문제언어결과실행 시간메모리
1124150jitic22514Cloud Computing (CEOI18_clo)C++17
18 / 100
385 ms327680 KiB
//#include<bits/stdc++.h> #include<iostream> #include<vector> #include<algorithm> #define ll long long #define pir pair<int,int> #define fi first #define se second using namespace std; const int maxn = 2e3 + 5; const ll inf = 1e17; const int maxk = 56; template <class t1,class t2> inline void mini(t1 &x,t2 y){if (x > y) x = y;} template <class t1,class t2> inline void maxi(t1 &x,t2 y){if (x < y) x = y;} struct computer{ int core,flow,price; bool operator <(const computer&other) const{ return (flow < other.flow); } }; struct order{ int C,F,V; bool operator <(const order&other) const{ return (F < other.F); } }; ll dp[maxn][maxn][maxk]; ll f[maxn][maxk]; computer a[maxn]; order b[maxn]; void input(int &n,int &m){ cin >> n; for (int i = 1 ; i <= n ; i++) cin >> a[i].core >> a[i].flow >> a[i].price; cin >> m; for (int i = 1 ; i <= m ; i++) cin >> b[i].C >> b[i].F >> b[i].V; } void perform_dp(int i,int n,int m){ int cap = a[i].core; for (int j = m ; j > 0 ; j--){ if (a[i].flow < b[j].F) continue; int bC = b[j].C,bV = b[j].V; //classic cases: for (int k = 0 ; k <= cap ; k++) maxi(dp[i][j][k],dp[i][j + 1][k]); for (int k = bC ; k <= cap ; k++) maxi(dp[i][j][k],dp[i][j + 1][k - bC] + bV); /// //new case: partialy bought order for (int k = 0 ; k <= bC ; k++){ int t = bC - k; if (t <= cap) maxi(dp[i][j][t],f[j][k] + bV); } } for (int j = 0 ; j <= m + 1 ; j++) for (int k = 0 ; k <= cap + 1 ; k++) dp[i][j][k] -= a[i].price; //propagate to new case for (int j = m ; j > 0 ; j--){ if (a[i].flow < b[j].F) continue; int bC = b[j].C; //k : i'm going to buy for (int k = 0 ; k <= min(bC,cap) ; k++){ maxi(f[j][k],dp[i][j + 1][cap - k]); } } } void remf(int m){ for (int i = 0 ; i <= m + 2 ; i++) for (int j = 0 ; j <= 51 ; j++) f[i][j] = -inf; } ll solve(int n,int m){ sort(a + 1,a + 1 + n); sort(b + 1,b + 1 + m); remf(m); for (int i = n ; i > 0 ; i--) perform_dp(i,n,m); ll res = 0; for (int i = 1 ; i <= n ; i++) for (int j = 1 ; j <= m ; j++) for (int k = 0 ; k <= 50 ; k++) maxi(res,dp[i][j][k]); return res; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0);cout.tie(0); // freopen("COMPUTING.inp","r",stdin); // freopen("COMPUTING.out","w",stdout); int n,m; input(n,m); cout << solve(n,m); return 0; }
#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...