[NOIP2015]跳石头

[USACO 2009 Dec S]Music Notes

https://ac.nowcoder.com/acm/contest/22353/A

	AC 代码
 #include <bits/stdc++.h>
  using namespace std;
  long long int a[50010];
  long long int L;
  int N;
  bool test(long long int x, int M){
      long long int stone[50010];
      int k = 0;
      int p = 0;
      int q = 1;
      while(q < N + 1){
          if(a[q] - a[p] >= x) {
              stone[++k] = p;
              p = q; q++;
          }else{
              q++;
              M--;
          }
      }
      long long int right = a [N+1];
      long long int left = a[p];
      while( right - left < x){
          if(k <= 0) return 0;
          left = a[stone[k--]];
          M--;
      }

      if(M >= 0 ) return 1;
      return 0;
  }

  int main(int argc, const char * argv[]) {
      int M;
      scanf("%lld", &L);
      cin >> N >> M;
      a[0]= 0;
      for(int i = 1 ; i <= N ; i++){
          cin >> a[i];
      }
      a[N + 1] = L;
      long long int l = 0;
      long long int r = L;
      while ( l <= r) {
          long long int mid = (l + r)/ 2;
  //        cout <<"FLSH" << l << " " << mid  << " "<< r << endl;
          if(test(mid, M)) l = mid + 1;
          else r = mid - 1;
      }
      cout << r << endl;
  //    cout << test(2);
      return 0;
  }
  
  
  需要注意 :1 M不能是全局变量, 每次要传参。
  2 双指针部分有些难
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务