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]; // 存放结果的数组b
int[] 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]; // 存放结果的数组b
int[] 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] + " ");
}
}
}
}
这两种解法的思路都是通过计算累乘数组和前缀和数组来得到最后的结果,第二种解法通过使用前缀和数组,减少了一个双层循环的计算,从而提高了效率。