题解 | #视野争夺#

视野争夺

http://www.nowcoder.com/practice/61e1e66e39f348cdb6495de91ac36a41

  1. 这是一个线段性质的问题。注意如何从左边到右边,依次处理了基本的三个线段关系,以及i达到最后一个的时候怎么判断是否能覆盖。(很重要)
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    long L;
    long xi,yi;
    cin>>n>>L;

    vector<pair<int,int>> v;

    for(int i =0; i< n;i++){
        cin>>xi>>yi;
        v.push_back({xi,yi});
    }


    sort(v.begin(),v.end(),[](pair<long,long> a, pair<long,long> b){
        if(a.first==b.first){
            return a.second>b.second;
        }else{
            return a.first<b.first;
        }
    });

    int pre = 0, last = 0, i =0, ans = 0;

    while(i<v.size()){

        while(i<v.size()&&v[i].first<=pre){//处理堆叠情况以及下一次的连续链接情况
            last = max(last,v[i].second);//前面是处理最后一条
            i++;
        }
        pre = last;//进行下一步是否有缺口判断
        ans++;
        if(i<v.size()&&v[i].first>pre){
            ans==-1;
            break;
        }
        if(last>=L){
            break;//剪枝,只处理下面的
        }


    }

    if(ans==-1||last<L){//前面如果执行完last还不够的话,证明还是不行
        cout<<-1<<endl;
    }else{
        cout<<ans<<endl;
    }




    return 0;
}
大厂笔试题题解 文章被收录于专栏

主要是公司笔试题得一些总结

全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务