fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. int main() {
  6. int n;
  7. cin >> n;
  8.  
  9. vector<pair<int,ll>> ng; // (단자-1, 즐거움)
  10. vector<ll> bt; // 단자0 즐거움 양수
  11. ll y = 0, h = 0; // 단자>=1 즐거움 양수 합과 단자 총합
  12.  
  13. for(int i=0;i<n;i++){
  14. int a; ll b; cin >> a >> b;
  15. if(b>0){
  16. if(a==0) bt.push_back(b);
  17. else y += b, h += a-1;
  18. } else if(b<0 && a>1){
  19. ng.push_back({a-1,b});
  20. } else if(b==0 && a>1){
  21. h += a-1;
  22. }
  23. }
  24.  
  25. sort(bt.rbegin(), bt.rend());
  26. for(size_t i=1;i<bt.size();i++) bt[i] += bt[i-1];
  27.  
  28. const int MX=2000;
  29. vector<ll> dp(MX+1, LLONG_MIN);
  30. dp[min(MX,(int)h)] = 0;
  31.  
  32. for(auto t: ng){
  33. int step = t.first;
  34. ll val = t.second;
  35. for(int i=MX-1;i>=0;i--){
  36. if(dp[i]!=LLONG_MIN){
  37. int ni = min(MX,i+step);
  38. dp[ni] = max(dp[ni], dp[i]+val);
  39. }
  40. }
  41. }
  42.  
  43. ll ans = LLONG_MIN;
  44. for(int i=0;i<=MX;i++){
  45. ll add = i<bt.size()? bt[i] : bt.back();
  46. ans = max(ans, dp[i]+add+y);
  47. }
  48. cout << ans << "\n";
  49. }
Success #stdin #stdout 0s 5320KB
stdin
15
1 -4034
1 3406
0 6062
4 -6824
0 9798
0 4500
0 -1915
1 2137
0 9786
0 7330
0 -9365
2 2730
0 -5797
0 6129
0 8925
stdout
43417