【Codeforces 1148B】生まれこの道

[リンク] 私は、私はそれをリンクを指しています:) [タイトル]イタリア


それはBに、次いで、BからCフライから飛翔することでした。
nまでのA、Bを考えると、フライトの出発時刻をメートル。
AからBに知られている航空はB TAとTBに到達するのに長い時間で、Cの
離陸するB飛行に到達するまでの時間だけではなく(もちろん、あなたはまた、次の授業のために待つことができる)
便をKに、今あなたがアップを取り除くことができることを尋ね、この最新の到着時刻の人々へのCは(Cに達することができないか、この人の直接出力)シャシ(その人はあなたが削除した後、最良のオプションを選択します)があります

[説明]


あなたは確信している場合、その人は確かに早いほど良いからのフライトを知っています。
確かにAからKの最後の飛行は、二つの場所でB飛行は削除します。
だから我々は、私にの飛行を削除したどのように多くの列挙することができます(私は明らかに早い飛行がベストです削除)
してから早い飛行を見てBへのシャシ侯がされている[I + 1] + TA
明らかに我々は[IDX] BのTA + [I + 1]よりも小さいか等しいを見つけたい。
しかし、心配しないでください、私たちはその後、気のフライトを削除することができ、同じ戦略もされて
、次のいずれかをすることができKI idxのを削除します。私は早いCの時に到着した男をk個削除し、削除の合計を与えるために、フライトケース
十分なすべての可能な最大値で。
以下のようないくつかの状況で注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