Advertisement
Guest User

Untitled

a guest
Jul 13th, 2018
415
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef int64_t ll;
  5.  
  6. template<typename T1, typename T2> inline bool umn (T1& a, T2 b) {if (b < a) {a = b; return 1;} return 0;}
  7.  
  8. const int N = 300;
  9. const int T = 300;
  10.  
  11. struct Input {
  12.     int n, t;
  13.     ll k;
  14.     ll a[N + 1], b[N + 1], c[N + 1];
  15.    
  16.     bool read () {
  17.         if (!(cin >> n >> t >> k)) {
  18.             return 0;
  19.         }
  20.         forn (i, n) {
  21.             scanf("%" SCNd64 "%" SCNd64 "%" SCNd64, &a[i], &b[i], &c[i]);
  22.         }
  23.         return 1;
  24.     }
  25.  
  26.     void init (const Input &input) {
  27.         *this = input;
  28.     }
  29. };
  30.  
  31. struct Data: Input {
  32.     ll ans;
  33.  
  34.     void write () {
  35.         cout << ans << endl;
  36.     }
  37. };
  38.  
  39.  
  40. namespace Main {
  41.  
  42.     const ll inf = ll(1e18);
  43.    
  44.     struct Solution: Data {
  45.  
  46.         ll sa[N + 2];
  47.         ll sb[N + 2];
  48.  
  49.         ll d[N + 2][T + 1][2];
  50.         ll g[T + 1][2];
  51.        
  52.         void solve () {
  53.             a[n] = 0;
  54.             b[n] = 0;
  55.             c[n] = 0;
  56.             sa[0] = 0;
  57.             sb[0] = 0;
  58.             forn (i, n + 1) {
  59.                 sa[i + 1] = sa[i] + a[i];
  60.                 sb[i + 1] = sb[i] + b[i];
  61.             }
  62.             memset(d[0], 0, sizeof d[0]);
  63.             forn (i, n + 1) {
  64.                 forn (j, t + 1) {
  65.                     forn (z, 2) {
  66.                         d[i + 1][j][z] = inf;
  67.                         g[j][z] = inf;
  68.                     }
  69.                 }
  70.                 d[i + 1][0][0] = 0;
  71.                 d[i + 1][0][1] = 0;
  72.                 forn (j, t + 1) {
  73.                     forn (z, 2) {
  74.                         if (d[i][j][z] == inf || (z ? 0 : a[i]) + j * b[i] > c[i]) {
  75.                             continue;
  76.                         }
  77.                         umn(d[i + 1][j][z], d[i][j][z]);
  78.                         umn(g[j][z], ((z ? 0 : sa[i]) + j * sb[i] + k - 1) / k);
  79.                     }
  80.                 }
  81.                 forn (s, t + 1) {
  82.                     forn (z, 2) {
  83.                         if (g[s][z] == inf) {
  84.                             continue;
  85.                         }
  86.                         ll val = (z ? 0 : sa[i + 1]) + s * sb[i + 1] - k * g[s][z];
  87.                         if (i == n) {
  88.                             val = 0;
  89.                         }
  90.                         if (val < 0) {
  91.                             continue;
  92.                         }
  93.                         forn (j, t - s + 1) {
  94.                             if (d[i][j][1] == inf || val % k + j * b[i] > c[i]) {
  95.                                 continue;
  96.                             }
  97.                             ll add = (max<ll>(val + j * b[i] - c[i], 0) + k - 1) / k;
  98.                             umn(d[i + 1][s + j][z], g[s][z] + add + d[i][j][1]);
  99.                             umn(g[s + j][z], g[s][z] + add + (j * sb[i] + k - 1) / k);
  100.                         }
  101.                     }
  102.                 }
  103.             }
  104.             ans = d[n + 1][t][0];
  105.         }
  106.        
  107.         void clear () {
  108.             *this = Solution();
  109.         }
  110.     };
  111. }
  112.  
  113.  
  114. Main::Solution sol;
  115.  
  116. int main () {
  117.     cout.setf(ios::showpoint | ios::fixed);
  118.     cout.precision(20);
  119.  
  120.     sol.read();
  121.     sol.solve();
  122.     sol.write();
  123.    
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement