区间选点问题

区间选点问题。数轴上有n个闭区间[ai,bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。

贪心策略:

把所有区间按终点从小到大排序(b相同时a从大到小排序),则如果出现区间包含的情况,小区间一定排在前面。第一个区间应该取最后一个点。
参考:http://blog.csdn.net/dgq8211/article/details/7534776
这里写图片描述

代码:

#include <bits/stdc++.h>

using namespace std;
const int maxn = 1010;
struct seg
{
   int a;
   int b;
   bool operator < (const seg& S)const
   {
       return b<S.b || b==S.b && a>S.a;
   }
}seg[maxn];



int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
     cin>>seg[i].a>>seg[i].b;

    sort(seg,seg+n);
    /*for(int i=0;i<n;i++)
        cout<<seg[i].a<<seg[i].b<<endl;*/
    int cnt=0;
    int e = -(1<<30);
    for(int i=0;i<n;i++)
    {
        if(seg[i].a>e)
        {
            e=seg[i].b;
            cnt++;
        }
    }
    cout<<cnt<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值