给出一组数,再给出x, y
判断在当前数组中至少需要插入几个数满足x,y出现在某两个数的差值中
我刚开始的想法是x,y依次加数组中的数,放入数组来找重复,想法没错,但是太难搞了
后来听说用set搞就行。。。很久没用set,都忘了怎么用了
后来看了下别人的代码,发现这个题还是很容易的
因为有0的存在,首先考虑set中已经出现x,y的情况
接着我们假设插入一个数和另外两个数的差值关系满足条件,那么这个数可以放在这两个数的左边、中间、右边
对应三中情况
最后就是需要插入两个数的情况
注意考虑边界情况,以及数据大小
代码如下:
#include <bits/stdc++.h>
#define LL long long
#define MAXN 300010
using namespace std;
LL a[MAXN];
set<LL> q;
int main(void) {
int n, l, x, y, ansx, ansy;
scanf("%d%d%d%d", &n, &l, &x, &y);
for(int i=1; i<=n; ++i) {
cin >> a[i];
q.insert(a[i]);
}
ansx = ansy = -1;
for(int i=1; i<=n; ++i) {
if(q.count(a[i]-x)) ansx = i;
if(q.count(a[i]-y)) ansy = i;
}
if(ansx!=-1 && ansy!=-1) {
puts("0");
return 0;
}
if(ansx != -1) {
printf("1\n%d\n", y);
return 0;
}
if(ansy != -1) {
printf("1\n%d\n", x);
return 0;
}
for(int i=1; i<=n; ++i) {
if(q.count(a[i]-x-y) && i>=2) {
puts("1");
cout << a[i]-x << endl;
return 0;
}
if(q.count(a[i]+x-y) && a[i]+x<=l && i<n) {
puts("1");
cout << a[i]+x << endl;
return 0;
}
if(q.count(a[i]-y+x) && a[i]-y>=0 && i>=2) {
puts("1");
cout << a[i]-y << endl;
return 0;
}
}
printf("2\n%d %d\n", x, y);
return 0;
}