【Codeforces 1148B】Born This Way
【链接】 我是链接,点我呀:)
【题意】
【题解】
如果你是那个人肯定知道从A出发的航班肯定越早越好。 最后的K个航班肯定是从A、B两地的航班里删掉的。 所以我们可以这样,枚举删掉了A的多少个航班i(显然是删掉最早的i个航班效果最佳) 然后看看最早的航班是啥时候到B即为a[i+1]+ta 显然我们要找到最小的大于等于a[i+1]+ta的b[idx]. 但是不着急 我们可以接着删除k-i个航班,则也是同样的策略 删idx接下来的k-i个即可。从而得到A航班删掉i个的情况下总共删掉k个这个人最早到达C的时间了。 在所有的可能中取最大值就好了。 注意-1的几种情况就好了【代码】
#include<iostream>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cstring>
using namespace std;
const int N = 2e5;
int n,m,ta,tb,k;
int a[N+10],b[N+10];
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> m >> ta >> tb >> k;
for (int i = 1;i <= n;i++) cin >> a[i];
for (int i = 1;i <= m;i++) cin >> b[i];
if (k>=n){
cout<<-1<<endl;
return 0;
}
int ans = 0;
for (int i = 1;i <= min(k+1,n);i++){
int used1 = i-1;
int idx2 = lower_bound(b+1,b+1+m,a[i]+ta)-b;
if (idx2>m){
cout<<-1<<endl;
return 0;
}
int rest = k-used1;
if (idx2+rest>m){
cout<<-1<<endl;
return 0;
}
idx2 = idx2+rest;
ans = max(ans,b[idx2]+tb);
}
cout<<ans<<endl;
return 0;
}