Educational Codeforces Round 40 (Rated for Div. 2) B、C

B题目链接

被hack了、感觉好头疼、代码的逻辑还是不严谨、在此提醒自己、

import java.util.Scanner;

public class B {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int len = input.nextInt();
        String s = input.next();
        char [] c = s.toCharArray();
        int maxAns = 0;
        for(int j = 1; j < len; j++){
            int ans = j + 1; // 记录比较字符串的长度、、  从2开始、(不然没有意义)
            if(ans + j < len){
                boolean flag = true;
                for(int k = 0; k <= j; k++){
                    if(s.charAt(k) != s.charAt(ans + k)){
                        flag = false;
                        break;
                    }
                }
                if(flag){
                    maxAns = Math.max(ans, maxAns);
                }
            }else{
                break;
            }
        }
        if(maxAns == 0){
            System.out.println(len);
        }else{
            System.out.println(len - maxAns * 2 + maxAns + 1); // 复制的代价、制造一条链、在复制(代价+1)
        }
        
/*        for (int i = 0; i <= len / 2; i++) {   //  hack  、、、
            int tmp = 0;
            for (int j = 0; j < i; j++) { //  i的长度 、找出最长的、、
                if (c[j] == c[j + i]) {
                    tmp++;
                    maxAns = Math.max(maxAns, tmp);  // 找出最长的字符列、、
                } else {
                    break;
                }
            }
        } // 找到能复制的最大的一个了、、 (最大的重复自序列)   

        System.out.println(len - maxAns);*/

    }
}

C题目链接

这道题目的思路是、(数据量很大、不能枚举)、所以我先通过两个相同的坐标来判断、因为只能相邻的移动、所以两个坐标相减,可能是上下移动(相差y)、也可能是左右移动(相差1)、所以先把y找出来、如果没有的话、就特判1

通过计算出来的y、来将x,y的坐标分解出来、如果x1 - x2 ,y1 - y2的绝对值相加为1 那就是相邻的移动、若有一个不符合就是不存在、上代码、

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class C {

    static int MAXN = 1000000000; // 开这么大 才不会被卡住、、、
    static int n;
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        in.nextToken();
        n = (int) in.nval;
        int[] a = new int[n]; // 输入存放的数组、、
        for (int i = 0; i < n; i++) {
            in.nextToken();
            a[i] = (int) in.nval;  // 输入数据、、
        }
        solve(a);
    }

    private static void solve(int[] arr) {  // 输入传入的数组、、
        int y = -1;
        for(int i = 0; i < n - 1; i++){  // 这里 我需要找出 y 的大小来、、
            if(Math.abs(arr[i] - arr[i + 1]) > 1){ 
                if(y == -1){
                    y = Math.abs(arr[i] - arr[i + 1]);
                }else if(y != Math.abs(arr[i] - arr[i + 1])){
                    out.println("NO");
                    out.flush();
                    return;
                }
            }
        }
        if(y == -1){ // 找不到的情况、 这个时候就只有 1 可能符合、、、
            y = 1;  
        }
        
        for(int i = 0; i < n - 1; i++){ //  判断是否是上下左右移动、、、(两个坐标只会相差 1)
            int x1 = (arr[i] - 1) / y + 1;
            int y1 = (arr[i] - 1) % y + 1;
            int x2 = (arr[i + 1] - 1) / y + 1;
            int y2 = (arr[i + 1] - 1) % y + 1;
            int ans = Math.abs(x1 - x2) + Math.abs(y1 - y2);
            if(ans != 1){
                out.println("NO");
                out.flush();
                return;
            }
        }
        out.println("YES");
        out.println(MAXN + " " + y);
        out.flush();
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值