zoukankan      html  css  js  c++  java
  • 【Codeforces 1041D】Glider

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

    题意

    【题解】

    二分。 枚举每一个上升区的起始位置作为起点(这样做肯定是最优的),然后如果没有掉在地上的话就尽量往右二分(只有上升区之间的间隙会让他往下掉) 用前缀和处理出来每个上升区的长度,这样就能根据前缀和处理出来从第i个上升区到第mid个上升区之间有多少个空隙(即会往下掉)了。

    也可以用一个队列模拟高度为h够掉多少个上升区,如果整个队里里面的上升区(从最左端开始)经过之后会掉到地面,那么就只要让左端点往右移动就可以了。
    (然后减少掉落的高度,也即减少代价看看是否小于h,如果仍然大于等于,就继续往右)
    (问题就转换成,选择某个数字之后,会有一定的代价,然后要连续选择,然后有一个代价的上限,让你选择尽可能多的一个连续长度数字)

    【代码】

    #include <bits/stdc++.h>
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i>= b;i--)
    #define ll long long
    using namespace std;
    
    const int N = (int)2e5;
    
    int n,h;
    pair<int,int> a[N+10];
    int sum[N+10];
    
    bool ok(int start,int idx){
        int dis = a[idx].first-a[start].first;
        dis-=sum[idx-1]-sum[start-1];
        if (dis>=h) return false;
        return true;
    }
    
    int main(){
        ios::sync_with_stdio(0),cin.tie(0);
        cin >> n >> h;
        for (int i = 1;i <= n;i++){
            int x,y;
            cin >> x >> y;
            a[i].first = x;a[i].second = y;
        }
        for (int i = 1;i <= n;i++){
            sum[i] = a[i].second-a[i].first;
            sum[i]+=sum[i-1];
        }
        int ans = 0;
        for (int i = 1;i <= n;i++){
            int l = i,r = n,temp = i;
            while (l<=r){
                int mid = (l+r)/2;
                if (ok(i,mid)){
                    temp = mid;
                    l = mid + 1;
                }else{
                    r = mid - 1;
                }
            }
            int dis = a[temp].second-a[i].first;
            int rest = dis-(sum[temp]-sum[i-1]);
            rest = h-rest;
            dis += rest;
            ans = max(ans,dis);
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    进程线程协程
    面向对象完善总结
    面向对象编程
    常用模块2
    python常用模块
    随机验证码模块(random)
    带有key参数的函数filter,map,max,min
    python内置函数、匿名函数、递归
    python迭代器与生成器
    如何添加title左侧的图标
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10674193.html
Copyright © 2011-2022 走看看