二分贪心 V 公共区间最少元素

来源:互联网 发布:hp5200网络打印机驱动 编辑:程序博客网 时间:2024/06/05 01:58

1、简单描述

给出n个连续区间,区间元素只包含整数,在数轴上任取一些元素构成集合A,使所给出的每个区间都至少有两个元素与该区间中元素相同,A中至少有多少元素?

2、思路

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct node
{
    int l,r;
} a[10001];
bool cmp(node A,node B)
{
    if(A.r!=B.r)
        return A.r<B.r;
    else return A.l>B.l;
}
int main()
{
    int i,n,t,t1,t2;
    while(cin>>n)
    {
        memset(a,0,sizeof(a));
        for(i=0; i<n; i++)
            {
                cin>>a[i].l>>a[i].r;
            }
            sort(a,a+n,cmp);
            int s=2,t1=a[0].r,t2=a[0].r-1;
            for(i=1;i<n;i++)
            {
                if(t2>=a[i].l)
                    continue;
                else if(t2<a[i].l&&t1>=a[i].l)
                {
                    t2=a[i].r;
                    s++;
                }
                else if(t2<a[i].l&&t1<a[i].l)
                {
                    t1=a[i].r;
                    t2=a[i].r-1;
                    s+=2;
                }
                if(t1<t2)
                {
                    t=t1;
                    t1=t2;
                    t2=t;
                }
            }
            cout<<s<<endl;
    }
    return 0;
}

贪心。

先对所有区间按末端点排序

取第i个区间的最后两个元素12

若第i+1个区间包含了这两个元素,则跳到下一个区间所取的元素个数+0

若第i+1个区间只包含了这两个元素中的一个,已经进行排序,一定包含元素2,则取第i+1个区间的最后一个元素,所取的元素个数+1。为了方便下一区间的比较,更新12的值,使他们为当前A集合中最后的两个元素。

若第i+1个区间没有包含这两个元素,则第i+1个区间的最后两个元素,所取的元素个数+2。为了方便下一区间的比较,更新12的值,使他们为当前A集合中最后的两个元素。

1初始化为第一个区间的倒数第2个元素

2初始化为第一个区间的最后的元素

所取的元素个数初始化为2 (就是SelemEelem)


0 0
原创粉丝点击