Codeforces Round #562 (Div. 2) Increasing by Modulo

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;
} 
View Code

猜你喜欢

转载自www.cnblogs.com/lin1874/p/10953776.html