Advertisement
mickypinata

IPST61: Chicken Tart

Jul 10th, 2021
1,216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long lli;
  5. typedef pair<int, int> pii;
  6.  
  7. const int N = 1e5;
  8.  
  9. int arr[N + 1], cntLeft[N + 2], cntRight[N + 2];
  10. int nTart, limLen, nPiece, mxLen;
  11.  
  12. bool canDivide(lli m){
  13.     lli sum = 0;
  14.     int tartCnt = 0;
  15.     int cnt = 0;
  16.     bool broken = false;
  17.     for(int i = 1; i <= nTart; ++i){
  18.         if(broken){
  19.             cntLeft[i] = 1e9;
  20.             continue;
  21.         }
  22.         if(arr[i] > m){
  23.             cntLeft[i] = 1e9;
  24.             broken = true;
  25.             continue;
  26.         }
  27.         if(sum + arr[i] > m || tartCnt + 1 > limLen){
  28.             ++cnt;
  29.             sum = 0;
  30.             tartCnt = 0;
  31.         }
  32.         sum += arr[i];
  33.         ++tartCnt;
  34.         cntLeft[i] = cnt + 1;
  35.     }
  36.     sum = 0;
  37.     tartCnt = 0;
  38.     cnt = 0;
  39.     broken = false;
  40.     for(int i = nTart; i >= 1; --i){
  41.         if(broken){
  42.             cntRight[i] = 1e9;
  43.             continue;
  44.         }
  45.         if(arr[i] > m){
  46.             cntRight[i] = 1e9;
  47.             broken = true;
  48.             continue;
  49.         }
  50.         if(sum + arr[i] > m || tartCnt + 1 > limLen){
  51.             ++cnt;
  52.             sum = 0;
  53.             tartCnt = 0;
  54.         }
  55.         sum += arr[i];
  56.         ++tartCnt;
  57.         cntRight[i] = cnt + 1;
  58.     }
  59.  
  60.     int mn = 1e9;
  61.     for(int i = mxLen; i <= nTart; ++i){
  62.         mn = min(mn, cntLeft[i - mxLen] + cntRight[i + 1]);
  63.     }
  64.     if(mn <= nPiece - 1){
  65.         return true;
  66.     } else {
  67.         return false;
  68.     }
  69. }
  70.  
  71. int main(){
  72.  
  73.     scanf("%d%d%d", &nTart, &limLen, &nPiece);
  74.     lli sum = 0;
  75.     for(int i = 1; i <= nTart; ++i){
  76.         scanf("%d", &arr[i]);
  77.         sum += arr[i];
  78.     }
  79.     mxLen = min(limLen, nTart - nPiece + 1);
  80.  
  81.     lli l = 0;
  82.     lli r = sum;
  83.     lli mn = sum;
  84.     while(l <= r){
  85.         lli m = (l + r) / 2;
  86.         if(canDivide(m)){
  87.             mn = min(mn, m);
  88.             r = m - 1;
  89.         } else {
  90.             l = m + 1;
  91.         }
  92.     }
  93.     cout << mn;
  94.  
  95.     return 0;
  96. }
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement