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;
    }
    
  • 相关阅读:
    MVP模式与MVVM模式
    webpack的配置处理
    leetcode 287 Find the Duplicate Number
    leetcode 152 Maximum Product Subarray
    leetcode 76 Minimum Window Substring
    感知器算法初探
    leetcode 179 Largest Number
    leetcode 33 Search in Rotated Sorted Array
    leetcode 334 Increasing Triplet Subsequence
    朴素贝叶斯分类器初探
  • 原文地址:https://www.cnblogs.com/AWCXV/p/10674193.html
Copyright © 2011-2022 走看看