题目描述
相较于咕咕东,瑞神是个起早贪黑的好孩子,今天早上瑞神起得很早,刷B站时看到了一个序列,他对这个序列产生了浓厚的兴趣,他好奇是否存在一个数,使得一些数加上,一些数减去,一些数不变,使得整个序列中所有的数相等,其中对于序列中的每个位置上的数字,至多只能执行一次加运算或减运算或是对该位置不进行任何操作。由于瑞神只会刷B站,所以他把这个问题交给了你!
输入格式
输入第一行是一个正整数表示数据组数。 接下来对于每组数据,输入的第一个正整数表示序列的长度,随后一行有个整数,表示序列。
输出格式
输出共包含行,每组数据输出一行。对于每组数据,如果存在这样的K,输出"YES",否则输出“NO”。(输出不包含引号)
输入样例
2
5
1 2 3 4 5
5
1 2 3 4 5
输出样例
NO
NO
解题思路
首先我们可以知道的是,这个问题探究的范围一定是整数域,不然无解。
对于某一个数列,要满足上述条件,即
- 某个数可以加上一个K
- 某个数可以减去一个K
- 某个数可以不变
所以从这个条件里我们可以轻松发现,这个数列里只能最多有三种互异的数,否则,假如有四个不一样的数,那么一定无法满足这个条件(在整数域情况下)
所以我们只需要判断某个数列:
- 如果这个数列只有1个元素/2个元素,那么一定可以满足
- 如果这个数列有大于等于3个元素,那么如果这些元素只有小于等于三种数,就满足条件
根据这个发现写代码即可
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
typedef long long ll;
using namespace std;
ll a[10001];
vector<ll>judge;
bool isOK;
void Init()
{
memset(a, 0, sizeof a);
judge.clear();
isOK = true;
}
bool cmp(ll a, ll b)
{
return a < b;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t, n;
bool hasIn = false;
bool hasSort = false;
cin >> t;
while (t--)
{
Init();
hasSort = false;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];//输入序列a
}
for (int i = 0; i < n; i++)
{
if (i == 0)
{
judge.push_back(a[0]);
}
else
{
hasIn = false;
for (int j = 0; j < judge.size(); j++)
{
if (a[i] == judge[j])//已经出现过
{
hasIn = true;
break;
}
}
if (!hasIn)
{
judge.push_back(a[i]);
}
}
if (judge.size() == 3 && (!hasSort))
{
sort(judge.begin(), judge.end(), cmp);
hasSort = true;
if ((judge[1] - judge[0]) != (judge[2] - judge[1]))
{
isOK = false;
break;
}
}
if (judge.size() > 3)
{
isOK = false;
break;
}
}
if (isOK) cout << "YES" << endl;
else cout << "NO" << endl;
}
}