SYS招新啦!
ES天天在SYS没事干,忽然想组织一波招新以扩大SYS的队伍。
然后有一堆萌新报名了,所有萌新的关系都特别好,因为同性。
因为萌新实在是太多了,ES想要做一个刷选,来刷掉一些人。ES使用超自然力,造了一条很长很长的直线跑道,萌新被带到了跑道上面,跑道上有些位置存在宝石,坏坏的ES说:“如果你们能按规定的时间拿到宝石并到我指定的点,就算你们晋级了!”
每个萌新,宝石以及ES指定的位置都在同一直线上,位置可以类比为数轴上的点,一个人只能拿一个宝石,每个人移动一个位置的时间为1。题目保证:没有两个人在同一位置,没有两个宝石在同一位置。由于这些萌新关系都特别好,他们的目标是所有人晋级,请问他们能达到目的么?
Input
输入包含多组数据。
对于每组数据,第一行输入4个整数N,M,P,T(1<=N<=M<=106, 1<=P<=109, 0<=T<=232-1),分别代表有N个萌新,M个宝石,ES指定的P位置,ES要求的时间T;
第二行输入N个整数,第 i 个整数 a[ i ]代表第 i 个萌新的位置。(a[i - 1] < a[ i ], i >= 2)
第三行输入M个整数,第 i 个整数 b[ i ]代表第 i 个宝石的位置。(b[i - 1] < b[ i ], i >= 2)
1<=a[i], b[i]<=109.
Output
对于每组数据,输出 “Yes” 代表所有人都能晋级,否则输出”No”.
Sample Input
1 1 10 7
11
7
Sample Output
Yes
Source
2017新生训练赛第一场
ans:
看宝石,最优拿的策略是,拿身边最近的,然后就是看是不是所有人都能拿,数据好像是有点小问题
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=(ll)1e6+10;
ll a[N],b[N];
int main()
{
ll n,p,t,m,i,j;
while(cin>>n>>m>>p>>t)
{
for(i=0;i<n;i++)
scanf("%lld",a+i);
for(i=0;i<m;i++)
scanf("%lld",b+i);
ll f=0,now=0;
for(i=0;i<m;i++)
{
if(abs(a[now]-b[i])+abs(b[i]-p)<=t&&now<n) now++;
if(now==n)
{
f=1;
break;
}
}
if(f)
puts("Yes");
else puts("No");
}
return 0;
}