这题是一个基本的贪心思想,由于我们要让一个比赛给后面的比赛空出尽可能多的时间,我们要让每个出现在日程表上比赛的结束时间越早越好。
先排序,再根据结束时间顺序选择。
#include<bits/stdc++.h>
using namespace std;
int a[1010000][3];
void haha(int l,int r)
{
int i,j,x,y,n;
x=a[(l+r)/2][2];i=l;j=r;
do{
while(a[i][2]<x)i++;
while(a[j][2]>x)j--;
if (i<=j)
{swap(a[i][1],a[j][1]);swap(a[i][2],a[j][2]);i++;j--;}
}while(i<=j);
if (i<r)haha(i,r);
if (j>l)haha(l,j);
}//以活动时间结束先后顺序快排
int main()
{
int i,j,x=0,n,y=0;
cin>>n;
for (i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];//分别读入开始与结束时间
haha(1,n);//快排
for (i=1;i<=n;i++)
if (a[i][1]>=y)//如果遇上一个活动为重叠,选择结束时间早的
{x++;y=a[i][2];}//总数加一
cout<<x;
return 0;
}