【Codeforces 1148B】Born This Way

【链接】 我是链接,点我呀:)
【题意】


有人要从A地飞向B地,然后从B地飞向C地。
给出A,B地的n、m个航班的出发时间。
已知从A到B的航班都是ta和tb时长到达B、C
只有到达B的时候航班还没起飞才能乘坐(当然也可以等下一班)
问你现在你可以去掉最多K个航班,这个人到达C地最晚的时间是啥时候(那个人会在你删掉之后选择最好的方案)(或者直接输出这个人不能到达C)

【题解】


如果你是那个人肯定知道从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;
}

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/11111229.html
way