Codeforces 1343B - Balanced Arra
2020-05-01 本文已影响0人
费城的二鹏
这些单薄的树,就长在高速路两边,另一边就是田地,它们就在人类活动痕迹的夹缝中生存。如果挡了路会被伐,挡了光也会被伐,所以他们只能单薄,还得生对地方。
题目: Codeforces 1343B - Balanced Array
https://codeforces.com/problemset/problem/1343/B
翻译
给一个数字 n,保证数字 n 是偶数。
需要构造一个长度为 n 的数列 a,并有如下要求:
- 前 n/2 个元素要求是偶数
- 后 n/2 个 元素要求是奇数
- a 内的所有元素要求不同并且是正数
- 前半部分元素的和等于后半部分的元素的和
如果有很多答案,可以随便输出任意答案,不保证可以构建出答案。
输出格式
- 如果不能构建答案输出单行的 NO
- 如果能构建答案输出单行 YES 并且在下一行输出答案
分析
因为元素都是奇数或者偶数,所以只能是整数,此时需要分成两种情况讨论。
- 如果 n/2 为奇数,那么奇数个奇数相加是奇数,偶数个奇数相加是偶数,所以前后不能相等,所以这种情况直接输出 NO
- 如果 n/2 为偶数,则必定可以构建成功,前半部分构建成 2, 4, 6, ···, n。后半部分大概是 1, 3, 5, ···, n - 3, n - 1 + n / 2
可以看到构建的最后一个数字与其它不一样,因为后半部分会比前半部分每个数字少1,一共少 n / 2,所以最后一个数字要在基础上加 n/2,并且 n/2 是偶数所以加上之后依旧是奇数,构造的数列符合所有要求。
总结来说,这是道很简单的题目,大概就是找规律吧,当初ACM称作水题。
代码(Python3)
# https://codeforces.com/problemset/problem/1343/B
import sys
# sys.stdin = open(r"./file/input.txt", 'r')
# sys.stdout = open(r"./file/output.txt", 'w')
t = int(input())
for i in range(t):
n = int(input())
count = int(n / 2)
if count % 2 == 1:
print("NO")
else:
print("YES")
for j in range(1, count + 1):
if j != 1:
print(" ", end="")
print(j * 2, end="")
for j in range(1, count + 1):
print(" ", end="")
if j == count:
print(j * 2 + count - 1)
else:
print(j * 2 - 1, end="")
by 费城的二鹏 2020.05.01