区间问题

区间问题的主要思想就是贪心

重点是先将区间按左(右)边界排序,如何分辨要用左边界还是右边界就是一个大问题

区间合并

原题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
pair<int,int> q[N];
int main(){
    std::ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>q[i].first>>q[i].second;
    sort(q+1,q+1+n);
    int r=q[1].second,ans=1;
    for(int i=2;i<=n;i++){
        if(q[i].first<=r)
        r=max(r,q[i].second);
        else ans++,r=q[i].second;
    }
    cout<<ans;
}

 

最小支配集和最大独立集

代码相同

具体证明(据说)及其复杂,这里就不说明了。

原题:最小支配集    最大独立集

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,ll;
pair<int,int> q[N];
int main(){
    std::ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>q[i].second>>q[i].first;
    sort(q+1,q+1+n);
    int r=q[1].first,ans=1;
    for(int i=2;i<=n;i++){
        if(q[i].second>r)
        ans++,r=q[i].first;
    }
    cout<<ans;
}

 

区间分组

区间分组问题流程与上题差不多,区别就在于要将不重合的区间分组。

原题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;

struct Node{
    int l,r;
    bool operator<(const Node &W)const{
    return l<W.l;
    }
}node[N];

int main(){
    int n;
    std::ios::sync_with_stdio(false);
    cin>>n;
    for(int i=0;i<n;i++){
        int l,r;
        cin>>l>>r;
        node[i]={l,r};
    }

    sort(node,node+n);
    priority_queue<int,vector<int>,greater<int> > heap;
    heap.push(node[0].r);
    for(int i=1;i<n;++i){
        if(node[i].l>heap.top())
            heap.pop();
            heap.push(node[i].r);
    }
    cout<<heap.size()<<endl;
    return 0;
}

 

posted @ 2019-07-25 13:27  嘤嘤狂吠OVO  阅读(305)  评论(0编辑  收藏  举报