【第十三题】任务安排(北理工/北京理工大学/程序设计方法与实践/小学期 )

本文介绍了一道关于贪心算法的编程题目,博主通过阅读论坛讨论理解了题意,即根据任务结束时间进行排序,尽可能多地安排任务。代码中使用了C语言的qsort函数对结构体数组进行排序,着重解释了如何定义cmp函数以适应结构体排序,并提供了完整的代码实现。博主还分享了可以使用冒泡排序或者归并排序的思路,但选择了效率更高的qsort。
摘要由CSDN通过智能技术生成

目录

前言 

思路:

怎么排序?

代码:



前言 

 这题其实一点都不难,完全靠自己,只需要学点东西,不看题解都可以做出来。

这题从大佬们的说法来看就是典型的贪心问题,说人话就是越多越好。

截图来自于论坛大佬们,字多的就跟他混就完事。

思路:

 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亦梦亦醒乐逍遥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值