C. Increasing by Modulo
题目链接:http://codeforces.com/contest/1169/problem/C
最开始没有思路,参考的大佬的思路有点明白为什么二分次数了,但是如何检测那部分还是有点不太理解。
AC代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
//给一个数组,数组中元素范围为0~m,每次你可以选择若干元素进行(ai+1)%m的操作,问至少多少次可以使数组元素呈现非严格单调递减的状态
//二分+贪心。二分次数,然后尽可能让当前元素小,但要大于前一个元素。
public class Main {
static int n,m;
static long a[]=new long[300005];
static long b[]=new long[300005];
static boolean check(long x){
long maxx=0;
for(int i=1;i<=n;i++){
b[i]=a[i];
}
for(int i=1;i<=n;i++){
if(b[i]<maxx){
if(b[i]+x<maxx){
return false;
}else{
b[i]=maxx;
}
}else if(b[i]>maxx){
if(b[i]+x>=maxx+m){
continue;
}else{
maxx=Math.max(maxx, b[i]);
}
}
}
return true;
}
static StreamTokenizer st=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static void main(String[] args) {
n=nextInt();
m=nextInt();
for(int i=1;i<=n;i++){
a[i]=nextInt();
}
long r=10000000;
long l=0;
long ans=0;
while(l<=r){
long mid=(l+r)>>1;
if(check(mid)){
ans=mid;
r=mid-1;
}else{
l=mid+1;
}
}
System.out.println(ans);
}
static int nextInt(){
try {
st.nextToken();
} catch (IOException e) {
e.printStackTrace();
}
return (int)st.nval;
}
}
D. Good Triple
题目链接:http://codeforces.com/contest/1169/problem/D
感觉这题比C简单呢。。
AC代码:
import java.util.Scanner;
//可以知道01字符串在长度很短的时候就一定存在这样的区间,所以就算暴力枚举左端点,满足条件的右端点也一定会在左端点不远处,
//所以可以直接暴力枚举左端点i,一点点检查恰好成立的右端点j,则有ans+=len-j
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
char ctr[]=s.toCharArray();
int len=ctr.length;
long ans=0;
for(int i=0;i<len;i++){//枚举左端点
boolean flag=false;
for(int j=i;j<len;j++){//寻找满足条件的右端点
for(int k=1;j-2*k>=i;k++){
if(ctr[j]==ctr[j-k]&&ctr[j-k]==ctr[j-2*k]){
ans=ans+len-j;
flag=true;
break;
}
}
if(flag)
break;
}
}
System.out.println(ans);
sc.close();
}
}