算法 13.任务安排

该博客讨论了如何利用C语言内置的`qsort`函数解决任务安排问题。问题要求确定在给定一系列任务的开始和结束时间后,最多能完成多少任务,且每个任务不能重叠。博主通过创建结构体存储任务信息,并实现了一个比较函数`comp`用于快速排序。最终,采用贪心算法找出结束时间最早的任务优先执行,得出最大任务完成数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

小张经常为了事情太多安排不开而苦恼。现在他手头有 n 项任务,每项任务都有一个开始时间 s i s_i si和结束时间 e i e_i ei。要想完成一个任务必须从开始时间做到结束时间,并且同一时间小张只能进行一项任务。
小张想知道他最多可以完成几项任务。

输入

第一行一个整数 n ( 1 ≤ n ≤ 300000 n(1 \leq n \leq 300000 n(1n300000) ,表示小张手头任务的个数。

接下来 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(1si<ei109 ) ,表示任务的开始时间和结束时间。

输出

一行一个整数,表示小张最多可以完成几项任务。

样例数据

输入(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;  
}  
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值