题目:凌乱的yyy / 线段覆盖 - 洛谷
难度:★★
类型:贪心
分析:这题挺经典,是到不错的题目,推荐大家去做(到时点个赞再走),思路挺简单,按照结束时间sort排序就可以了,可以用struct辅助。
在这种情况下,我们会去选比赛1,因为它的结束时间早,可以去参加更多比赛。
很显然, 在这种情况下,我们也选比赛1),同样因为它的结束时间早,可以去参加更多比赛。
那么,我们排完顺序就可以用while或for循环,同时也要定义一个mini数组,表示当前比赛结束时间,如果这轮比赛开始时间>=mini,那么ans++;
说的差不多了,是时候把新鲜出炉的代码贴给大家了!!!
#include<bits/stdc++.h>
struct noip//有同学不会结构体的多开几个数组
{
int begin;//开始时间
int finish;//结束时间
}a[2000005];
bool cmp(noip x,noip y)
{
return x.finish<y.finish;//按结束时间排
}
using namespace std;
int main()
{
int n,ans=1;//初始化
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].begin>>a[i].finish;
}
sort(a+1,a+n+1,cmp);//快速排序(不用我多说了吧)
int mini=a[1].finish;//定义mini统计最后结束时间
int j=1;
while(j<=n)//我用了while,感兴趣的同学可以用for(提示:for不用定义j)
{
j++;
if(a[j].begin>=mini)//新的比赛开始时间要晚于mini
{
ans++;//统计比赛数
mini=a[j].finish;//更新mini
}
}
cout<<ans<<endl;//输出
return 0;//功德圆满
}