- Increasing by Modulo (Codeforce)
题目大意:
给定一组数字大小为0~m-1; 每次可以对任意多个数进行(ai+1)%m 的 操作
问最少操作次数 把这组数字变成非递减的
思路 ::因为每次操作是对任意多个数进行 所以相当于 求对一个数操作次数的最大值 所以直接二分答案就可,保证每一部都是最优解后直接二分答案就可
#include<bits/stdc++.h>
using namespace std;
int a[300100];
int n,m;
bool OK(int x)
{
int cnt=a[1];
if((a[1]+x)>=m) cnt=0;
for(int i=2;i<=n;i++)
{
if(a[i]==cnt) continue;
if(a[i]<cnt) {
if((a[i]+x)>=cnt) continue;
else return false;
}else {
if((a[i]+x)>=m) {
if((a[i]+x)%m>=cnt) continue;
else cnt=a[i];
}
else cnt=a[i];
}
}
return true;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int l=0,r=m,f=0;
while(l<=r)
{
int mid=(l+r)/2;
if(l==r){
printf("%d\n",mid);
break;
}
if(OK(mid)){
r=mid;
}
else {
l=mid+1;
}
}
}
2.湖上泛舟 (HRBUST)
题目::
寒鸦空啼惊泛客,渔火独明暖沙洲。
年少既知愁滋味,一曲弹罢泪空流。
欲言还休不语处,只道心头好个秋。
这天,LCH在湖上划船,发现在湖中间某个点有一小岛,他很想上去看看。但是天公不作美,今天的风很大,而且风向多变,每一分钟都可能向着不同的方向吹。但是LCH有一个智能APP,可以预测出一段时间内的风向。假如风向是URLD,那么第一分钟风往U方向吹,第二分钟往R方向吹,第三分钟第四分钟则是L和D,到了第五分钟,又往U方向吹,以此类推。
假设风往U方向吹,那么船会从(x,y)移动到(x,y + 1)。
假设风往D方向吹,那么船会从(x,y)移动到(x,y - 1)。
假设风往L方向吹,那么船会从(x,y)移动到(x - 1,y)。
假设风往R方向吹,那么船会从(x,y)移动到(x + 1,y)。
LCH也可以控制船,在每分钟可以向着UDLR四个方向划船或者不划船,如果LCH选择划船,则相当于小船先沿风向走一个单位,再向划船方向走一个单位,如果LCH不划船,则相当于小船只是沿着风向走一个单位。
LCH很懒惰,他想知道最少多少分钟,他能达到小岛。
当然,他有可能根本无法到达小岛。
Input
每组输入数据包含两行。
第一行包括4个数字x1,y1,x2,y2,代表LCH和小岛的笛卡尔坐标位置。
第二行只有一行字符串s,代表APP预测的风向。
0 <= x1,y1,x2,y2 <= 1e9,s的长度不会超过1e5,并且只含有UDLR四种字符。
Output
输出一个整数,代表LCH到达小岛的最短时间,如果不能,则输出 -1 。
思路::直接二分答案,因为二分答案同时可以得到可自控移动的距离