题解 | 元素方碑

元素方碑

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();
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务