IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 贪心的小明看电视(后续)——链表 -> 正文阅读

[数据结构与算法]贪心的小明看电视(后续)——链表

题目

为了方便阅读,这里再把题目重复一遍

题目描述

暑假到了,小明终于可以开心的看电视了,但是小明喜欢的节目太多了,他希望尽量多的看到完整的节目,现在他把他喜欢的电视节目的转播时间表给你,你能帮他合理安排吗?

输入

每组输入的第一行是一个整数n(n<=100),表示小明喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(1<=i<=n),表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。

输出

输出能完整看到的电视节目的个数。

样例输入

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9

样例输出

5

过程剖析

1.创建链表——输入节目信息

首先定义合适的结构体类型 Time来储存单个节目信息和 List来储存链表信息,具体如下

typedef struct time{
	int start;
	int end;
	struct time *next;
}Time;//存放电视节目时间
typedef struct list{
	Time *head;
	Time *tail;
}List; //储存链表信息

用一个结构体单独存放链表信息的目的,在于更好的归纳各个链表,在这个例子中具体体现的作用,是在建立链表时能更方便地使用尾接法。

接着定义了一个add函数,将每一次输入的信息即时地生成结点并尾接链表,函数如下:

void add(List *list,int a,int b){
	Time *p=NULL;//工具指针 暂时存放结点
	//生成新结点
	p=(Time *)malloc(sizeof(Time));
	p->start = a;
	p->end = b; 
	p->next = NULL;
	//将新结点插尾
	if(list->tail ){
		//如果链表不空,接尾
		list->tail ->next=p;
		list->tail =p;
	}else{
	//如果为空链表,令头指针指向头结点,尾指针也要指向头结点,不然,尾和头断连 
		list->head =p;
		list->tail =p;
	}

2.链表排序——以节目结束时间排序

同样定义了一个函数来进行排序,这个函数的排序思路与选择排序类似,在排序时只交换结点的数据域而不改变指针域,函数如下:

void sort(List *list,int n){//传入链表及电视节目个数 
	int i=0,start,end;//start和end 是交换工具,i控制循环次数
	Time *p1=list->head ;
	Time *p2=p1->next ;
	for(i=0;i<n;i++){
		for(p2=p1->next ;p2!=NULL;p2=p2->next){
			if(p1->end >p2->end ){
				//swap start
				start=p1->start ;
				p1->start =p2->start ;
				p2->start =start;
				
				//swap end
				end=p1->end ;
				p1->end =p2->end ;
				p2->end =end;
			}
		}
		p1=p1->next ;//p1后移 
	}
}

在不清楚结点个数(如n)时,也可通过判断p1是否为空结束循环

3.遍历链表——查询所看节目个数

又是一个函数,传入要查询的链表信息,传出所看节目数,具体如下:

int find(List *list){
	int count=1,really_end;
	Time *p=list->head ; 
	really_end=p->end ;
	while(p!=NULL){
		if(really_end<=p->start ){
			count++;
			really_end=p->end ;
		}
		p=p->next ;
	}
	return count;
} 

完整main函数

int main(void){
	int n=0,i=0,count=0;
	int start=0,end=0;//临时储存开始结束时间
	int really_end=0;
	Time *p=NULL,*q=NULL;//用于遍历链表看电视 
	
	//创建空链表
	List list;
	list.head=list.tail =NULL;
	 
	scanf("%d",&n);
	
	//输入节目信息 
	for(i=0;i<n;i++){
		scanf("%d %d",&start,&end);
		add(&list,start,end);
	}
	
	//给节目排序
	sort(&list,n);
	p=list.head ;

	//遍历链表计数并输出
	count=find(&list);
	printf("%d",count); 
	 
	return 0;
}

至此,小明成功看到了电视。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-18 11:25:30  更:2021-11-18 11:26:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 11:28:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码