479D - Long Jumps

简单题目。就是有个数组。然后有x、y两个数,要求在这个数组中看看有没有两个只差等于x或者y的,如果没有则需要添加若干数字,问最少添加多少数字,并输出数字。使得满足要求。添加的数字<=l。比赛的时候很傻比。只考虑添加一个数字,刚好可以使得x、y同时可以得到。只要在数组中找 y-x==a[e]-a[s]或者y+x==a[e]-a[s](比赛的时候这个没考虑到啊,哎傻逼啊)2个指针找找就行了。用map可以简单很多。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <cassert>
#include <stack>
#include <map>
using namespace std;

typedef long long ll;
typedef pair<int, int>pll;


bool find_diff(vector<int>&re, int target){
	int s = 0,n=re.size(),e=0;
	while (e < n&&s<n){
		if (re[e] - re[s] < target) e++;
		else if (re[e] - re[s] == target) return true;
		else s++;
	}
	return false;
}
int main(){
	int n, l, x, y;
	while (cin >> n >> l >> x >> y){
		vector<int>cm(n);
		for (int i = 0; i < n; i++)
			cin >> cm[i];


		bool f1 = find_diff(cm, x);
		bool f2 = find_diff(cm, y);

		if (f1&&f2) cout << 0 << endl;
		else if (!f1&&!f2){
			int s = 0, n = cm.size(), e=0,lost;
			bool f3 = false;
			while (e < n&&s<n){
				if (cm[e] - cm[s] < y - x) e++;
				else if (cm[e] - cm[s] == y - x){
					if (cm[s] + y <= l){
						f3 = true;
						lost = cm[s] + y;
					}
					if (cm[s] >= x){
						lost = cm[s] - x;
						f3 = true;
					}
					s++; e++;
				}
				else s++;
			}

			if (f3 == false){
				s = e = 0;
				while (e < n&&s < n){
					if (cm[e] - cm[s] < y +x) e++;
					else if (cm[e] - cm[s] == y + x){
						f3 = true;
						lost = cm[s]+x;
						s++; e++;
					}
					else s++;
				}
			}
			if (f3){
				cout << 1 << endl;
				cout << lost << endl;
			}
			else{
				cout << 2 << endl;
				if (cm[0] + y <= l)
					cout << cm[0] + x << " " << cm[0] + y << endl;
				else
					cout << cm[n - 1] - y << " " << cm[n - 1] - x << endl;
			}
		}
		else{
			cout << 1<<endl;
			if (!f1) y = x;
			if (y + cm[0] <= l){
				cout << y + cm[0] << endl;
			}
			else {
				cout << cm[cm.size() - 1] - y << endl;
			}
		}
		
	}
}

你可能感兴趣的:(479D - Long Jumps)