问题描述
小张经常为了事情太多安排不开而苦恼。现在他手头有 n 项任务,每项任务都有一个开始时间
s
i
s_i
si和结束时间
e
i
e_i
ei。要想完成一个任务必须从开始时间做到结束时间,并且同一时间小张只能进行一项任务。
小张想知道他最多可以完成几项任务。
输入
第一行一个整数 n ( 1 ≤ n ≤ 300000 n(1 \leq n \leq 300000 n(1≤n≤300000) ,表示小张手头任务的个数。
接下来 n 行,每行两个整数 s i , e i ( 1 ≤ s i < e i ≤ 1 0 9 s_i,e_i(1 \leq s_i < e_i \leq 10^9 si,ei(1≤si<ei≤109 ) ,表示任务的开始时间和结束时间。
输出
一行一个整数,表示小张最多可以完成几项任务。
样例数据
输入(1)
4
1 5
5 10
7 13
12 18
输出(1)
3
代码
直接用C语言内置的快排的库函数就OK了,就是需要搞一下指针的设置
#include <stdio.h> //这是第十三题 排队问题
#include <stdlib.h> //需要使用qsort函数,导入这个函数库
typedef struct
{
long int s;
long int e;
} time; //构建一个结构体,因为每个任务的开始和结束时间都是一个整体。
time t[300001]; //构建一个结构数组,来存放每个任务的信息
int comp(const void* a,const void* b)
{
return (*(time*)a).e-(*(time*)b).e;
}
int main()
{
long int a,n;
scanf("%ld",&n);
for(long int p=0;p<n;p++)
{
scanf("%ld",&(t[p].s));
scanf("%ld",&(t[p].e));
}
qsort (t,n,sizeof(time),&comp); //使用冒泡排序会超时,使用快速排序会出现排序错误,应该是迭代的时候参数传错了,但是一时半会没想到怎么改,改用qsort函数
//需要传入的四个参数,首先是指向需要排序的序列开头的指针,之后是需要排序的序列的长度,之后是序列里每个元素的长度,最后是返回一个整数的地址。
a=1;
for(long int i=1,j=0;i<n;i++) //这里使用标准的贪心算法,选出结束时间最早的任务来执行,之后不断取结束之后可以兼容的任务中结束时间最早的作为下一个任务
{
if(t[i].s>=t[j].e)
{
a++;
j=i;
}
}
printf("%ld\n",a);
return 0;
}