Codeforces Round #562 (Div. 2) (Java版)

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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值