【基础练习】【贪心】codevs1214 线段覆盖题解

来源:互联网 发布:设计程序的软件 编辑:程序博客网 时间:2024/04/28 22:52

题目:已知数轴上0<N<10000条线段。每条线段按照端点Ai和Bi(Ai<>Bi,i=1..N)定义。端点坐标在(-999,999)内,坐标为整数。有些线段可能相交。编程实现删除最少数目的线段,使得余下的任意两条线段不相交。

codevs和洛谷数据范围不同 改一下常量maxn即可

思路是很简单的贪心

//codevs1214 线段覆盖 贪心//先排序,扫描一遍,每次保留右端点最小的线段,重叠的delete,画一张图即可证明#include<cstdio>#include<cstring>using namespace std;const int maxn=100+10;int l[maxn],r[maxn];bool st[maxn];int main(){int n;scanf("%d",&n);for (int i=0;i<n;i++){scanf("%d%d",&l[i],&r[i]);if (l[i]>r[i]){int temp=l[i];l[i]=r[i];r[i]=temp;}    }    for (int i=0;i<n;i++){    for (int j=i+1;j<n;j++){    if (r[i]>r[j]){    int temp1=r[i];    int temp2=l[i];    r[i]=r[j];l[i]=l[j];    r[j]=temp1;l[j]=temp2;}}}memset(st,true,sizeof(st));for (int i=0;i<n;i++){if (st[i]){for (int j=i+1;j<n;j++){if (st[j]&&(l[j]<r[i])){st[j]=false;}}}} int ans=0;for (int i=0;i<n;i++) if (st[i]) ans++;printf("%d",ans);return 0;} 

——自牧归荑,洵美且异;匪女之为美,美人之贻。

1 0
原创粉丝点击