UVA-1617 Laptop (贪心)

题目大意:有n条长度为1的线段,n个区间,第i条线段在第i个区间中,问线段之间的最少间隙有几个。

题目分析:先对区间排序,先按右端点排,再按左端点排。有重叠的区间(仅有交点重叠也视为重叠)之间一定可以摆不出空隙来。贪心策略:每碰到一个新的区间(与前面区间没有任何重叠),则把线段放到该区间最后一个长度为1的位置,如果不是新区间则可以直接忽略。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<algorithm>
using namespace std;

struct Q
{
    int l,r;
    bool operator < (const Q &a) const {
        if(r==a.r)
            return l<a.l;
        return r<a.r;
    }
};
Q a[100005];

void solve(int n)
{
    int ans=0,p=-1;
    for(int i=0;i<n;++i){
        if(a[i].r==p)
            continue;
        if(a[i].l>p){
            ++ans;
            p=a[i].r;
        }else
            ++p;
    }
    printf("%d
",ans-1);
}

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;++i)
            scanf("%d%d",&a[i].l,&a[i].r);
        sort(a,a+n);
        solve(n);
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/20143605--pcx/p/4876753.html