CCF-CSP真题202209-1如此编码(Java满分题解)

1.题目详情

CCF-CSP真题202209-1如此编码(Java满分题解)_第1张图片

2.思路

(1)题目中的辅助数组ci是前缀乘积数组,即为对应下标之前A数组中的所有元素的乘积。

202309-2坐标变换(其二)题目中是前缀和。前缀和是对应下标之前所有元素的总和。

202109-1数组推导中的用的是前缀最大值。前缀最大值是对应下标之前所有元素中最大的一个元素。

(2)题目实质本意就是通过m的值以及a数组的值去推断出b数组的值。
(3)利用递推公式先求出b数组的第一个元素,然后循环中利用递推公式依次求出b数组每一个元素的值。

第一种解法:Java代码如下(100分)

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //2022.9-1 如此编码
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] b = new int[n + 1];
        //辅助数组
        int[] ci = new int[n + 1];
        ci[0] = 1;
        //ci数组赋值
        for (int i = 1; i <= n; i++) {
            ci[i] = sc.nextInt();
            ci[i] *= ci[i - 1];
        }
        //先把b数组的第一个元素套公式赋值,后面的元素放进循环中做统一处理
        b[1] = (m % ci[1]) / ci[0];
        for (int i = 2; i <= n; i++) {
            int temp = 0;
            for (int j = i; j >= 2; j--) {
                temp += b[j - 1] * ci[j - 2];
            }
            b[i] = (m % ci[i] - temp) / ci[i - 1];
        }
        //贴合题目输出要求格式,最后一个数据不加空格
        for (int i = 1; i <= n; i++) {
            if (i == n) {
                System.out.print(b[i]);
            } else {
                System.out.print(b[i] + " ");
            }
        }
    }
}

第二种解法:Java代码如下(100分)这里多定义了一个数组即为“前缀和”数组,将第一种解法中的一个双层for循环换成单层for循环。典型的空间换时间优化。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        //2022.9-1 如此编码
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] b = new int[n + 1];
        //辅助数组
        int[] ci = new int[n + 1];
        ci[0] = 1;
        //ci数组赋值
        for (int i = 1; i <= n; i++) {
            ci[i] = sc.nextInt();
            ci[i] *= ci[i - 1];
        }
        //定义一个前缀和数组
        int[] prefixSum = new int[n+1];
        for (int i = 1; i <= n; i++) {
            if(i != 1){
                prefixSum[i] = b[i-1] * ci[i-2] + prefixSum[i-1];
            }
            b[i] = (m % ci[i] - prefixSum[i]) / ci[i - 1];
        }
        //贴合题目输出要求,最后一个输出没有空格
        for (int i = 1; i <= n; i++) {
            if (i == n) {
                System.out.print(b[i]);
            } else {
                System.out.print(b[i] + " ");
            }
        }
    }
}

你可能感兴趣的:(java,算法)