题解:P1803 凌乱的yyy / 线段覆盖
ChuMengLong · · 题解
题目传送门
解析
题目大意
简化题意:给出一些区间,选择一些区间进行覆盖,问最多可以同时覆盖多少区间,且满足没有任何一处是同时覆盖了两个区间?
考察知识
本题考查贪心算法。
思路
我们把每个区间输入头尾端点,然后进行排序:按照区间尾端点从小到大排序,注意:是尾端点而不能是头端点,因为如果是头端点的话可能会出现以下图的问题。 绿色区间明显相对红色区间更优,但是由于排头端点,所以会先选择红色区间,然后忽略绿色区间。
然后我们只需要枚举每一个区间,判断下一个区间的头端点是否大于当前区间的尾端点,如果满足则满足区间数量加一。
代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
int starttime;
int endtime;
}competition[100869100];
inline int cmp(node a,node b)
{
if(a.endtime<b.endtime)
{
return 1;
}
return 0;
}
int main()
{
int n,sum=1,statstarttime,j;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
cin>>competition[i].starttime>>competition[i].endtime;
}
sort(competition+1,competition+n+1,cmp);
statstarttime=competition[1].endtime;
while(j<=n)
{
j++;
if(competition[j].starttime>=statstarttime)
{
sum++;
statstarttime=competition[j].endtime;
}
}
cout<<sum;
}
//meituideng