zoukankan      html  css  js  c++  java
  • 【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;
    }
    
    
  • 相关阅读:
    Silverlight 控件绑定到对象
    开源编辑器Makedown的安装
    ASP.NET 4 和 Visual Web Developer 中的新增功能
    空间新闻模块CSS
    P2P之王者电骡Emule技术分析
    QQ向陌生人聊天的autoit脚本
    Er 一个开源游戏的诞生
    一个不错的源代码语法高亮插件dp.SyntaxHighlighter
    Aut2Exe编译au3脚本为可执行文件
    模拟:悬停和纯双点击移动设备的CSS
  • 原文地址:https://www.cnblogs.com/AWCXV/p/11111229.html
Copyright © 2011-2022 走看看