题解 | 元素方碑
元素方碑
https://www.nowcoder.com/practice/5c6e7ed4726e41f4ac99a4dedf1e5bb2
如果题目要求为当存在YES的情况时,输出具体轰击步骤
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(System.out);
int q = Integer.parseInt(br.readLine());
while (q-- > 0) {
int n = Integer.parseInt(br.readLine());
String[] strs = br.readLine().split(" ");
long[] a = new long[n + 1]; // 下标 1..n
long sum = 0;
for (int i = 1; i <= n; i++) {
a[i] = Long.parseLong(strs[i - 1]);
sum += a[i];
}
if (sum % n != 0) {
out.println("NO");
continue;
}
long avg = sum / n;
// 检查奇数位置和
long oddSum = 0;
int oddCount = (n + 1) / 2; // 下标 1,3,5,...
for (int i = 1; i <= n; i += 2) {
oddSum += a[i];
}
if (oddSum != avg * oddCount) {
out.println("NO");
continue;
}
out.println("YES");
// 存储操作步骤
List<String> steps = new ArrayList<>();
long[] b = a.clone();
// 第一步:调整奇数位置到 avg
for (int i = 2; i <= n - 1; i += 2) { // i 是偶数
long diff = b[i - 1] - avg;
if (diff > 0) {
// 正面轰击:i-1 -> i+1
for (int k = 0; k < diff; k++) {
steps.add(i + " FRONT");
}
b[i - 1] -= diff;
b[i + 1] += diff;
} else if (diff < 0) {
// 反面轰击:i+1 -> i-1
for (int k = 0; k < -diff; k++) {
steps.add(i + " BACK");
}
b[i - 1] -= diff; // diff 负数,所以减去负数=加上正数
b[i + 1] += diff;
}
}
// 现在奇数位置(1,3,5,...)都是 avg
// 第二步:调整偶数位置到 avg
for (int i = 3; i <= n - 1; i += 2) { // i 是奇数
long diff = b[i - 1] - avg;
if (diff > 0) {
for (int k = 0; k < diff; k++) {
steps.add(i + " FRONT");
}
b[i - 1] -= diff;
b[i + 1] += diff;
} else if (diff < 0) {
for (int k = 0; k < -diff; k++) {
steps.add(i + " BACK");
}
b[i - 1] -= diff;
b[i + 1] += diff;
}
}
// 输出步骤数
out.println(steps.size());
for (String s : steps) {
out.println(s);
}
}
out.flush();
}
}
查看25道真题和解析