每个测试文件均包含多组测试数据。第一行输入一个整数
代表数据组数,每组测试数据描述如下:
在一行上输入一个整数
表示数组的长度。保证
为偶数。
除此之外,保证单个测试文件的
之和不超过
。
对于每一组测试数据:
若不存在满足条件的数组,在一行上输出
;
若存在满足条件的数组,先在一行上输出
,再在下一行输出一个满足条件的数组
,相邻两个数之间使用空格分隔。
5 2 4 6 8 10
NO YES 2 4 1 5 NO YES 2 4 6 8 1 3 5 11 NO
2 4 2
YES 2 4 1 5 NO
在第一个样例中:
,前半部分长度为
,取两个不同的偶数
;
后半部分长度为
,取两个不同的奇数
;
,且所有元素互不相同,因此满足条件。
在第二个样例中,当
时无法同时满足和相等与互不相同的要求,故答案不存在。
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); // 读取测试用例数 while (T-- > 0) { int n = sc.nextInt(); if (n % 4 != 0) { // n是2的倍数但非4的倍数,无法满足条件 System.out.println("NO"); continue; } System.out.println("YES"); int m = n / 2; int[] arr = new int[n]; // 1. 构造前半段:连续偶数(2, 4, ..., 2m) for (int i = 0; i < m; i++) { arr[i] = 2 * (i + 1); } // 2. 构造后半段:前m-1个连续奇数,最后1个补全和 int sumEven = m * (m + 1); // 前半段和(公式:2+4+...+2m = m(m+1)) int sumOdd = 0; for (int i = 0; i < m - 1; i++) { arr[m + i] = 2 * i + 1; // 连续奇数:1, 3, 5... sumOdd += arr[m + i]; } arr[n - 1] = sumEven - sumOdd; // 最后一个奇数,确保两段和相等 // 输出数组 for (int num : arr) { System.out.print(num + " "); } System.out.println(); } sc.close(); } }