2022 09 01 如此编码
- 题解1
- 题解2
题解1
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 天数int m = sc.nextInt(); // 科目数int[] b = new int[n + 1]; // 存放结果的数组bint[] ci = new int[n + 1]; // 辅助数组ci,用于存放累乘的结果ci[0] = 1; // 初始值为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;// 通过累加计算b[i]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] + " ");}}}
}
题解2
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 天数int m = sc.nextInt(); // 科目数int[] b = new int[n + 1]; // 存放结果的数组bint[] ci = new int[n + 1]; // 辅助数组ci,用于存放累乘的结果ci[0] = 1; // 初始值为1// ci数组赋值,按照题目要求进行累乘for (int i = 1; i <= n; i++) {ci[i] = sc.nextInt();ci[i] *= ci[i - 1];}int[] prefixSum = new int[n + 1]; // 前缀和数组,用于优化计算// 计算b数组的值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]; // 根据公式计算b[i]}// 输出结果,贴合题目输出要求格式for (int i = 1; i <= n; i++) {if (i == n) {System.out.print(b[i]);} else {System.out.print(b[i] + " ");}}}
}
这两种解法的思路都是通过计算累乘数组和前缀和数组来得到最后的结果,第二种解法通过使用前缀和数组,减少了一个双层循环的计算,从而提高了效率。