B. Filya and Homework
原创
©著作权归作者所有:来自51CTO博客作者wx634d08b5232a4的原创作品,请联系作者获取转载授权,否则将追究法律责任
http://codeforces.com/contest/714/problem/B
给定一个序列,对于每一个元素,只能 + 或者 - 一个数val。这个数一旦选定,就不能改。
问能否变成全部数字都一样。
一开始还以为没 + 一次,就要 - 一次。 结果不是,一直wa
那么这样的话,这题的正解是观察法。也可以证明。
①、全部数字都一样、有两个不同数字、三个不同数字(a[1] + a[3] = 2 * a[2])这些都易懂
那4个不同数字为什么是no呢
可以想象成找不到一个点,作为圆心,包含另外3个点(这3点在一直线)。
所以对于有三个不同数字那个,其实就是判断是否为圆心。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
#include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
const int maxn = 100000 + 20;
int a[maxn];
int n;
LL val;
set<int> ss;
void work() {
cin >> n;
LL sum = 0;
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
sum += a[i];
ss.insert(a[i]);
}
// sort(a + 1, a + 1 + n);
if (ss.size() == 1 || ss.size() == 2) {
printf("YES\n");
return ;
} else if (ss.size() >= 4) {
printf("NO\n");
return ;
} else {
int now = 0;
for (set<int> :: iterator it = ss.begin(); it != ss.end(); ++it) {
a[++now] = *it;
}
if (a[1] + a[3] == 2 * a[2]) {
printf("YES\n");
return ;
}
printf("NO\n");
}
}
int main() {
#ifdef local
freopen("data.txt","r",stdin);
#endif
work();
return 0;
}
View Code