目录
前言
这题其实一点都不难,完全靠自己,只需要学点东西,不看题解都可以做出来。
这题从大佬们的说法来看就是典型的贪心问题,说人话就是越多越好。
截图来自于论坛大佬们,字多的就跟他混就完事。
思路:
PS:他说错了一点,就是不需要long long,10^9在int范围内,事实上我全是int;还有这个人出的问题有点莫名其妙,怎么re的?
怎么排序?
- 其实听舍友说这题不卡时间,用n^2的冒泡都可以做
- 但是前面不是刚写了个归并吗,不用白不用,练练手感多好。归并咱们12题给出的几个帖子就已经说的很明白了。不过归并我不打算用了,学一次留个印象,以后用到再学,现在再学个qsort不是更好吗hhh
- 除了归并其实还可以用qsort函数如下 C语言qsort()函数的使用 - 知乎
不过我们是用结构体的,所以排序的cmp函数,你要修改一下了,类推一下怎么用struct
task *即可。
还有就是1是执行交换。
代码:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 300010
struct task {
int start;
int end;
};
struct task tasks[SIZE];
int cmp(const void* p1,const void* p2);
int main(void)
{
int n;
int i;
// freopen("input.txt", "r", stdin);
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d%d", &tasks[i].start, &tasks[i].end);
//读入无误
qsort(tasks, n, sizeof(struct task), cmp);
//end正序排序结构体无误
int count = 1;//初始设为1 同时i也指向1位置
int endmax = tasks[0].end;
for (i = 1; i < n; i++)
if (endmax <= tasks[i].start)
{
count++;
endmax = tasks[i].end;
}
printf("%d\n", count);
// for (i = 0; i < n; i++)
// printf("%3d%3d\n", tasks[i].start, tasks[i].end);
return 0;
}
int cmp(const void* p1, const void* p2) //其实只需要在形参声明加const即可,反正又不用保护
{
const struct task* a = (const struct task*)p1;
const struct task* b = (const struct task*)p2;
int value;
if (a->end > b->end)
value = 1;
else if (a->end < b->end)
value = -1;
else value = 0;
return value;
}