Advertisement
mickypinata

PROG-T1107: Jump

Jul 7th, 2021
770
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e6;
  5.  
  6. int period[N + 1], sorted[N + 1], nPeriod, mxJump, mxCons;
  7.  
  8. bool canSkip(int x){
  9.     int cnt = 0;
  10.     int classCnt = 0;
  11.     bool isSkipping = false;
  12.  
  13.     for(int i = 1; i <= nPeriod; ++i){
  14.         if(period[i] > x && !isSkipping){
  15.             ++cnt;
  16.             isSkipping = true;
  17.             ++classCnt;
  18.             if(classCnt == mxCons){
  19.                 isSkipping = false;
  20.                 classCnt = 0;
  21.             }
  22.         } else if(isSkipping){
  23.             ++classCnt;
  24.             if(classCnt == mxCons){
  25.                 isSkipping = false;
  26.                 classCnt = 0;
  27.             }
  28.         }
  29.     };
  30.  
  31.     if(cnt > mxJump){
  32.         return false;
  33.     }
  34.     return true;
  35. }
  36.  
  37. int main(){
  38.  
  39.     scanf("%d%d%d", &nPeriod, &mxJump, &mxCons);
  40.     int mx = 1;
  41.     for(int i = 1; i <= nPeriod; ++i){
  42.         scanf("%d", &period[i]);
  43.         sorted[i] = period[i];
  44.         mx = max(mx, period[i]);
  45.     }
  46.     sort(sorted + 1, sorted + nPeriod + 1);
  47.  
  48.     int l = 1;
  49.     int r = nPeriod;
  50.     int ans = mx;
  51.     while(l <= r){
  52.         int m = (l + r) / 2;
  53.         if(canSkip(sorted[m])){
  54.             ans = min(ans, sorted[m]);
  55.             r = m - 1;
  56.         } else {
  57.             l = m + 1;
  58.         }
  59.     }
  60.     cout << ans;
  61.  
  62.     return 0;
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement