Description
小张经常为了事情太多安排不开而苦恼。现在他手头有n项任务,每项任务都有一个开始时间 si 和结束时间 ei 。要想完成一个任务必须从开始时间做到结束时间,并且同一时间小张只能进行一项任务。小张想知道他最多可以完成几项任务。
Input
第一行一个整数
表示小张手头任务的个数。
接下来 n 行,每行两个整数
表示任务的开始时间和结束时间。
Output
一行一个整数,表示小张最多可以完成几项任务。
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
思路
本题中,其实真正重要的是结束时间,而开始时间、持续时间都不能起决定作用。即使开始早,如果要做很久也不值得。
因此,先对输入的数据依据结束之间排序。初始话end=0.然后按结束时间递增,每次比较开始时间是否大等end,如果是,ans+1,同时end更新为本次结束时间;否则比较下一个任务。
代码
#include<stdio.h>
int a[300000][2],ans=0;
/*按结束时间排序*/
void qsort(int a[][2],int start,int end)
{
int l=start,r=end;
if(r-l<=0) return;
int key[2]={a[start][0],a[start][1]};
while(l<r){
while(a[r][1]>=key[1]&&l<r) r--;
a[l][1]=a[r][1];
a[l][0]=a[r][0];
while(a[l][1]<=key[1]&&l<r) l++;
a[r][1]=a[l][1];
a[r][0]=a[l][0];
}
a[l][1]=key[1];
a[l][0]=key[0];
qsort(a,start,l-1);
qsort(a,l+1,end);
}
main()
{
int n,i,j,end=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d %d",&a[i][0],&a[i][1]);
qsort(a,0,n-1);
//for(i=0;i<n;i++) printf("%d %d\n",a[i][0],a[i][1]);
for(i=0;i<n;i++){
if(a[i][0]>=end){
ans++;
end=a[i][1];
}
}
printf("%d\n",ans);
}