牛客周赛 Round 114 Java题解

一、A题 小彩找数

枚举 ,可能写的有点复杂

import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();


    /**
     * @throws IOException
     */
    private static void solve() throws IOException {
        // todo

        int arr[]=new int[4];

        int a=sc.nextInt();

        if(a==1){
            arr[1]=1;
        }else if(a==2){
            arr[2]=1;
        }else if(a==3){
            arr[3]=1;
        }

        int b=sc.nextInt();

        if(b==1){
            arr[1]=2;
        }else if(b==2){
            arr[2]=2;
        }else if(b==3){
            arr[3]=2;
        }

        int c=sc.nextInt();

        if(c==1){
            arr[1]=3;
        }else if(c==2){
            arr[2]=3;
        }else if(c==3){
            arr[3]=3;
        }

        for (int i = 1; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

    }

    public static void main(String[] args) throws Exception {
        int t = 1;
//        t = sc.nextInt();
        while (t-- > 0) {
            solve();
        }
    }

}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}

二、B题 小彩的好字符串

暴力,判断 3 的倍数的长度的 子串 即可

import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();


    /**
     * @throws IOException
     */
    private static void solve() throws IOException {
        int n=sc.nextInt();
        String str=sc.next();

        long cnt=0;

        for(int i=0;i<n;i++){
            for(int j=i+2;j<n;j++){
                String substring = str.substring(i, j + 1);
                if(substring.length()%3!=0){
                    continue;
                }
                int cnt1=0;
                int cnt2=0;
                int cnt3=0;
                for(int k=0;k<substring.length();k++){
                    if(substring.charAt(k)=='1'){
                        cnt1++;
                    }else if(substring.charAt(k)=='2'){
                        cnt2++;
                    }else if(substring.charAt(k)=='3'){
                        cnt3++;
                    }
                }
                if(cnt1==cnt2 && cnt2==cnt3){
                    cnt++;
                }
            }
        }

        System.out.println(cnt);

    }

    public static void main(String[] args) throws Exception {
        int t = 1;
//        t = sc.nextInt();
        while (t-- > 0) {
            solve();
        }
    }

}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}

三、C题 小彩的字符串交换

因为最多只需要操作 1 次

所以其实也就三种答案 -1 0 1

先检查 如果没有 1 2 3 这三个数 结果是 -1

再检查直接存在 123 靠一起的情况 结果是 0

剩下的结果都是 1

import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();


    /**
     * @throws IOException
     */
    private static void solve() throws IOException {
        // todo
        int n=sc.nextInt();
        String str=sc.next();

        if(count(str)==false){
            System.out.println("-1");
            return;
        }

        for(int i=0;i<n-3;i++){
            String substring = str.substring(i, i + 3);
            if(count(substring)==true){
                System.out.println("0");
                return;
            }
        }

        System.out.println("1");

    }

    static boolean count(String str){
        int cnt1=0;
        int cnt2=0;
        int cnt3=0;
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            if(c=='1'){
                cnt1++;
            }else if(c=='2'){
                cnt2++;
            }else if(c=='3'){
                cnt3++;
            }
        }
//        System.out.println(cnt1+" "+cnt2+" "+cnt3);
        if(cnt1!=0&&cnt2!=0&&cnt3!=0){
            return true;
        }
        return false;
    }

    public static void main(String[] args) throws Exception {
        int t = 1;
        t = sc.nextInt();
        while (t-- > 0) {
            solve();
        }
    }

}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}

四、D题 小彩的数组选数

动态规划

dp[] 数组的值为当前最大贪心值

import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();

    /**
     * @throws IOException
     */
    private static void solve() throws IOException {
        // todo
        int n=sc.nextInt();
        long arr[]=new long[n];

        for (int i = 0; i < n; i++) {
            arr[i]=sc.nextLong();
        }

        // dp[i]表示到第i个元素的最大贪心值
        long dp[]=new long[n+1];

//        long max=0;

        dp[1]=arr[0];

        for (int i = 2; i <= n; i++) {
            // 不操作
            long num1 = dp[i - 1];
            // 操作
            long num2 = dp[i - 2] + arr[i - 1];
            dp[i] = Math.max(num1, num2);
        }

        System.out.println(dp[n]);

    }

    public static void main(String[] args) throws Exception {
        int t = 1;
//        t = sc.nextInt();
        while (t-- > 0) {
            solve();
        }
    }

}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}

五、E题 小彩的数组构造

因为每个子数组肯定都是 1 的倍数

所以由 a 可知 n

即构造数组的长度为 a+2

我们可以一位一位的构造 这样就能每次构造出一个子数组

我们的目的是一步步消耗 b 和 c 的值

构造和为 2 的倍数的子数组但不是 3 的倍数的数的话 b--

构造和为 3 的倍数的子数组但不是 2 的倍数的数的话 c--

构造和为 6 的倍数的子数组的话 b-- c--

构造和为 5 的倍数的子数组 不变

最后要使 b 和 c 得为 0

import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();


    /**
     * @throws IOException
     */
    private static void solve() throws IOException {
        // todo
        long a=sc.nextInt();
        long b=sc.nextInt();
        long c=sc.nextInt();

        if(b>a||c>a){
            System.out.println("-1");
            return;
        }

        long n=a+2;
        long arr[]=new long[(int)n];

        arr[0]=2;
        arr[1]=3;

        for(int i=2;i<n;i++){
            if(a==b+c){
                // 构造和为2的倍数的子数组但不是3的倍数的数
                if (b != 0) {
                    long sumPrev = arr[i - 1] + arr[i - 2];
                    long total = sumPrev;
                    // 找到第一个是2的倍数且不是3的倍数的total
                    do {
                        total++;
                    } while (total % 2 != 0 || total % 3 == 0);
                    arr[i] = total - sumPrev;
                    a--;
                    b--;
                }
                // 构造和为3的倍数的子数组但不是2的倍数的数
                else if (c != 0) {
                    long sumPrev = arr[i - 1] + arr[i - 2];
                    long base = (sumPrev / 3 + 1) * 3;
                    long ans = (base % 2 == 0) ? base + 3 : base;
                    arr[i] = ans - sumPrev;
                    a--;
                    c--;
                }
            }else if(a<b+c){
                // 构造和为6的子数组
                long ans = (((arr[i-1]+arr[i-2])/6)+1)*6;
                arr[i]=ans-arr[i-1]-arr[i-2];
                a--;
                b--;
                c--;
            }
            else if (a > b + c) {
                // 构造和为5的倍数,但不是2或3的倍数的子数组
                long sumPrev = arr[i - 1] + arr[i - 2];
                long base = ((sumPrev / 5) + 1) * 5;
                while (base % 2 == 0 || base % 3 == 0) {
                    base += 5;
                }
                arr[i] = (int) (base - sumPrev);
                a--;
            }
        }

        System.out.println(n);
        StringBuilder sb=new StringBuilder();
        for (long i : arr) {
            sb.append(i).append(" ");
        }
        System.out.println(sb);

    }

    public static void main(String[] args) throws Exception {
        int t = 1;
//        t = sc.nextInt();
        while (t-- > 0) {
            solve();
        }
    }

}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}

六、F题 小彩的好数构

构造题

我是打表打出来的

这是结果

如果 n 是偶数

构造如下 1000000001 1212121212

如果 n 是奇数

构造如下 10000000001 12121212312

import java.math.BigInteger;
import java.util.*;
import java.io.*;
import java.math.*;
import java.lang.*;
import java.time.*;

public class Main {

    static IoScanner sc = new IoScanner();
//    static final int mod = (int) (1e9 + 7);

    static int n;
    static int arr[];
    static boolean visited[];
    static ArrayList<ArrayList<Integer>> adj = new ArrayList<>();

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

//        long testStart = 100000000;
//        long testEnd = 999999999;
//        System.out.println("开始搜索...(范围:" + testStart + " ~ " + testEnd + ")");
//        long count = 0;
//        for (long a = testStart; a <= testEnd; a++) {
//            for (long b = a; b <= testEnd; b++) {
//                count++;
//                BigInteger product = BigInteger.valueOf(a).multiply(BigInteger.valueOf(b));
//                if (checkProduct(product)==true) {
//                    System.out.println(a + " × " + b + " = " + product);
//                    return;
//                }
//            }
//        }

        int n = sc.nextInt();
        if (n == 1) {
            System.out.println("-1");
            return;
        }

        StringBuilder sb = new StringBuilder();
        sb.append(1);
        for (int i = 0; i < n - 2; i++) {
            sb.append(0);
        }
        sb.append(1);
        String num1=sb.toString();

        if(n%2==0){
            sb = new StringBuilder();
            for (int i = 0; i < n; i+=2) {
                sb.append("12");
            }
            String num2 = sb.toString();
            System.out.println(num1+" "+num2);
        }else {
            if(n==3){
                System.out.println(num1+" 131");
            }else{
                sb = new StringBuilder();
                for (int i = 0; i < n-3; i+=2) {
                    sb.append("12");
                }
                sb.append("312");
                String num2 = sb.toString();
                System.out.println(num1+" "+num2);
            }
        }



    }

    // 检查乘积是否符合条件(仅含1、2、3,无连续相同字符,且同时存在1、2、3)
    private static boolean checkProduct(BigInteger product) {
        String numStr = product.toString();
        boolean has1 = false;
        boolean has2 = false;
        boolean has3 = false;

        for (char c : numStr.toCharArray()) {
            if (c < '1' || c > '3') {
                return false;
            }
            if (c == '1') {
                has1 = true;
            } else if (c == '2') {
                has2 = true;
            } else if (c == '3') {
                has3 = true;
            }
        }
        if (!has1 || !has2 || !has3) {
            return false;
        }
        for (int i = 0; i < numStr.length() - 1; i++) {
            if (numStr.charAt(i) == numStr.charAt(i + 1)) {
                return false;
            }
        }
        return true;
    }
}

/**
 * IoScanner类
 *
 * @author Dduo
 * @version 1.0
 * @description 通过IO流操作缓冲区减少了与底层输入输出设备的交互次数,旨在简化 Java 中的标准输入读取操作。
 */
class IoScanner {
    BufferedReader bf;
    StringTokenizer st;
    BufferedWriter bw;

    public IoScanner() {
        bf = new BufferedReader(new InputStreamReader(System.in));
        st = new StringTokenizer("");
        bw = new BufferedWriter(new OutputStreamWriter(System.out));
    }

    public String nextLine() throws IOException {
        return bf.readLine();
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()) {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }

    public char nextChar() throws IOException {
        return next().charAt(0);
    }

    public int nextInt() throws IOException {
        return Integer.parseInt(next());
    }

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }

    public float nextFloat() throws IOException {
        return Float.parseFloat(next());
    }

    public BigInteger nextBigInteger() throws IOException {
        return new BigInteger(next());
    }

    public BigDecimal nextDecimal() throws IOException {
        return new BigDecimal(next());
    }
}