WA90 被一道贪心题目卡住了

题面:

题目描述
给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。只有当c<=a 且 b<=d 时,我们才认为区间[a,b]被区间[c,d]覆盖。在完成所有删除操作后,请你返回列表中剩余区间的数目。

输入格式
第一行输入一个整数n,代表有n个区间。以下n行,每行输入两个整数L,R,L代表区间左边界,R代表区间右边界。

输出格式
输出一个整数,代表列表中剩余区间的数目。

样例
Input 1
3
1 4
3 6
2 8
Output 1
2
样例解释
第一个区间[1,4]不能被其他区域覆盖,第三个区间[3,6]被[2,8]覆盖

数据范围
1<=n<=1000; 0<=l,r<=1e5; 不会存在相同的区间。

我的代码:

#include<bits/stdc++.h>
using namespace std;
struct Class{
	int beg,end;
}cla[1005];
bool cmp(Class a,Class b){
    if(a.beg!=b.beg)return a.beg<b.beg;
	return a.end<b.end;
}
int main(){
	int n,num=0;
	cin>>n;
	for(int i=0;i<n;i++)cin>>cla[i].beg>>cla[i].end;
	sort(cla,cla+n,cmp);
	int time=-1;
	for(int i=0;i<n;i++){
		if(time>=cla[i].end)num++;
        time=max(time,cla[i].end);
    }
	cout<<n-num;
	return 0;
}
1 个赞

@王建力 @严志刚

1 个赞

改成 a.end>b.end 吧,因为如果列表里有一段 beg 相同的序列,那么根据你的排序,end 最大的排在这一段的末尾,但循环是从头开始遍历的,所以检测不到覆盖

1 个赞

并且循环本身就是拿前面最长的区间和后面的区间比较,所以前面的区间应该让 beg 尽量小,end 尽量大

1 个赞

谢谢,@栗子酱 关帖

1 个赞