Advertisement
VisualPaul

Untitled

Sep 27th, 2014
508
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.06 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long int ll;
  6.  
  7. int d[102][1010];
  8. int p[102][1010];
  9. vector<int> o[102][1010];
  10.  
  11. int ti[102];
  12. int pr[102];
  13.  
  14. int main() {
  15.     int n, tmax;
  16.     cin >> n >> tmax;
  17.     for (int i = 0; i < n; ++i)
  18.         cin >> ti[i] >> pr[i];
  19.     for (int i = 1; i <= tmax; ++i) {
  20.         for (int j = 0; j < n; ++j) {
  21.             cerr << "d[" << j << "][" << i << "]\n";
  22.             //cerr << "case 1\n";
  23.             if (j == 0) {
  24.                 if (i >= ti[j]) {
  25.                     d[j][i] = pr[0];
  26.                     p[j][i] = i * pr[0];
  27.                     o[j][i].push_back(0);
  28.                 }
  29.                 continue;
  30.             }
  31.             //cerr << "we're here\n";
  32.             d[j][i] = d[j - 1][i];
  33.             p[j][i] = p[j - 1][i];
  34.             o[j][i] = o[j - 1][i];
  35.             if (i - ti[j] >= 0) {
  36.                 //cerr << "case 2\n";
  37.                 if (d[j - 1][i - ti[j]] + pr[j] >= d[j][i]) {
  38.                     int alt_probs = d[j - 1][i - ti[j]] + pr[j];
  39.                     vector<int> alt_op = o[j - 1][i - ti[j]];
  40.                     int alt_pen;
  41.                     if (alt_op.empty()) {
  42.                         alt_op.push_back(j);
  43.                         alt_pen = i * pr[j];
  44.                         cerr << "alt_pen = " << alt_pen << endl;
  45.                     } else {
  46.                         vector<int> pen_sum(alt_op.size() + 3);
  47.                         pen_sum[alt_op.size() - 1] = pr[alt_op.back()];
  48.                         for (int k = ((int)alt_op.size()) - 2; k >= 0; --k) {
  49.                             pen_sum[k] = pen_sum[k + 1] + pr[alt_op[k]];
  50.                         }
  51.                         vector<int> t_sum {0};
  52.                         for (int i = 0; i < ((int)alt_op.size()); ++i)
  53.                             t_sum.push_back(t_sum.back() + ti[alt_op[i]]);
  54.                         pair<int, int> penalty(std::numeric_limits<int>::max(), -1);
  55.                         for (int k = 0; k <= static_cast<int>(alt_op.size()); ++k) {
  56.                             pair<int, int> alt(pr[j] * (t_sum[k] + ti[j]) + pen_sum[k + 1] * ti[j], k);
  57.                             if (alt < penalty)
  58.                                 penalty = alt;
  59.                         }
  60.                         alt_pen = penalty.first;
  61.                         cerr << "alt_pen = " << alt_pen << endl;
  62.                         alt_op.insert(alt_op.begin() + penalty.second, j);
  63.                     }
  64.                     if (alt_probs > d[j][i] || alt_pen < p[j][i]) {
  65.                         d[j][i] = alt_probs;
  66.                         p[j][i] = alt_pen;
  67.                         o[j][i] = alt_op;
  68.                     }
  69.                 }
  70.             }
  71.             cout << "size = " << o[i][j].size() << '\n';
  72.             for (int x : o[i][j]) {
  73.                 cout << x + 1 << ' ';
  74.             }
  75.         }
  76.     }
  77.     //cerr << d[n - 1][tmax] << endl;
  78.  
  79.     cout << o[n - 1][tmax].size() << '\n';
  80.     for (int x : o[n - 1][tmax]) {
  81.         cout << x + 1 << ' ';
  82.     }
  83.     cout << endl;
  84.  
  85.  
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement