http://codeforces.com/contest/1169/problem/C
看了半天没看懂题意,然后看了一下别人的题解才清楚,还是太菜了.......
n个数,每次操作为(a[i]+1)%m,求最少操作数使n个数不递减;
操作m次跟没操作一样,所以上限为m,下限为0,二分....
#include <iostream> using namespace std; const int maxn=300000+10; int n,m; int a[maxn]; int b[maxn]; bool check(int x) { for(int i=1;i<=n;i++) b[i]=a[i]; for(int i=1;i<=n;i++) { if(b[i]>=b[i-1]) { if(b[i]+x-m>=b[i-1]) b[i]=b[i-1]; } else if(b[i]+x>=b[i-1]) b[i]=b[i-1]; if(b[i]<b[i-1]) return false; } /*for(int i=1;i<=n;i++) cout<<b[i]<<' '; cout<<endl;*/ return true; } int main() { cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } int left=0,right=m,mid,ans=0; while(left<=right) { mid=(left+right)/2; if(check(mid)) { ans=mid; right=mid-1; } else { left=mid+1; } } cout<<ans<<endl; return 0; }