解题思路
这是一道序列判定题目,主要思路如下:
-
关键观察:
- 每个元素最多只能被操作一次(加
或减
)
- 要使所有元素相等,最终值必须是原序列中的某个值
- 每个元素最多只能被操作一次(加
-
判断条件:
- 如果去重后元素个数小于3,一定可以实现
- 如果去重后元素个数大于3,一定不能实现
- 如果去重后正好3个元素,中间值必须是两端值的平均值
-
优化:
- 使用
set
自动去重并排序 - 使用迭代器访问首、中、尾元素
- 使用
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int k;
cin >> k;
while(k--) {
int n;
cin >> n;
// 使用set去重
set<int> nums;
for(int i = 0; i < n; i++) {
int x;
cin >> x;
nums.insert(x);
}
// 判断是否可能实现
if(nums.size() < 3) {
cout << "YES" << endl;
}
else if(nums.size() > 3) {
cout << "NO" << endl;
}
else {
// 检查三个数是否满足条件
auto it = nums.begin();
int first = *it;
int second = *(++it);
int third = *(++it);
if(second * 2 == first + third) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
while(k-- > 0) {
int n = sc.nextInt();
// 使用TreeSet去重并排序
TreeSet<Integer> nums = new TreeSet<>();
for(int i = 0; i < n; i++) {
nums.add(sc.nextInt());
}
// 判断是否可能实现
if(nums.size() < 3) {
System.out.println("YES");
}
else if(nums.size() > 3) {
System.out.println("NO");
}
else {
// 检查三个数是否满足条件
Iterator<Integer> it = nums.iterator();
int first = it.next();
int second = it.next();
int third = it.next();
if(second * 2 == first + third) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
}
}
}
}
def can_make_equal(n, nums):
# 去重
unique_nums = sorted(set(nums))
# 判断是否可能实现
if len(unique_nums) < 3:
return "YES"
elif len(unique_nums) > 3:
return "NO"
else:
# 检查三个数是否满足条件
if unique_nums[1] * 2 == unique_nums[0] + unique_nums[2]:
return "YES"
return "NO"
def main():
k = int(input())
for _ in range(k):
n = int(input())
nums = list(map(int, input().split()))
print(can_make_equal(n, nums))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:集合去重 + 数学判定
- 时间复杂度:
-
为测试用例数,
为序列长度
- 空间复杂度:
- 需要存储去重后的序列