A. Increasing by Modulo(二分)

题目链接:

https://codeforces.com/problemset/problem/1168/A

题目大意:

给你n个数和m,每个数的范围都是在0 ~ (m- 1)。然后每一次操作 你可以选择这n个数中的任意多个,可以将你选择的数(a[i]+1)%m。然后问你最小操作次数使得整个数列变成非递减的。

具体思路:

二分枚举操作次数,原则是在保持整个数列非递减的前提下,尽量保持每一个数尽可能小,这样的话这个数列更容易变成非递减的。

AC代码:

#include
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 3e5+100;
int a[maxn];
int n,m;
bool check(int x){
int pre;
if(a[1]+x>=m)pre=0;
else pre=a[1];
for(int i=2;i<=n;i++){
int tmp=-1;
if((a[i]+x)>=m&&(a[i]+x)%m>=pre)tmp=pre;
else if(a[i]<=pre&&a[i]+x>=pre)tmp=pre;
else if(a[i]>pre)tmp=a[i];
if(tmp==-1)return false;
pre=tmp;
}
return true;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){scanf("%d",&a[i]);}
int ans=0;
int l=0,r=m;
while(l<=r){
int mid=l+r>>1;
if(check(mid)){ans=mid;r=mid-1;}
else l=mid+1;
}
printf("%d\n",ans);
return 0;
}

 

转载于:https://www.cnblogs.com/letlifestop/p/10939636.html

你可能感兴趣的:(A. Increasing by Modulo(二分))