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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 贪心算法--合并果堆问题(c语言解析思路清晰) -> 正文阅读

[数据结构与算法]贪心算法--合并果堆问题(c语言解析思路清晰)

?贪心算法,我也刚入门不久,个人总结了三个步骤

①:对应关系:找到题目中到底哪里使用了贪心

②:操作关系:怎么样的代码能够实现贪心的操作目的

③:终止关系:在什么情况下,贪心终止,也就是什么时候结束代码

这里首先需要注意的就是,当每次相加之后,产生的新一个数不一定是序列中最小的,也就是还得进行排序,此时选择排序的方法就尤为重要 .

没懂的xd,我也给出了图解/doge/

?

?对应关系

?由题目中就显而易见,每次选取的两个数一定是整个序列中去操作的,而对应关系,贪心的地方就是只需要每次挑选当前序列中最小的两个.

第一步,对应关系:发现想要让消耗的体力最小,则需要每次的操作结果都是最小,也就是每次都是整个序列中最小的两个进行相加.

?okk,接下来的比较简单的地方,直接上代码

?

	int dui = 0;                                   //多少堆果子(1<=n<=10000)
	int tili = 0;                                  //体力消耗量
	int temp = 0;                                  //交换量
	printf("输入你的果子堆数:");
	scanf("%d", &dui);
	int *shu = (int *)malloc(sizeof(int)*dui);
	printf("输入你每堆果子的重量:");
	for (int i = 0; i < dui; i++)
	{
		scanf("%d", &shu[i]);                      //每堆数量(1<=shu[i]<=10000)
	}
	if(dui==1)
	{ 
		tili = shu[0];
	}
	for (int j = 0; j < dui; j++)                  //首先需要排一次升序
	{
		for (int k = 0; k < dui - j - 1; k++)
		{
			if (shu[k] > shu[k + 1])
			{
				temp = shu[k];
				shu[k] = shu[k + 1];
				shu[k + 1] = temp;
			}
		}
	}
	temp = 0;                         //为下一个交换重置

??上面的变量创建我就不赘述了,接着往下

接下来是找到操作关系

不难发现只要我们在相加之后,进行简单的排序,然后就可以继续将两个最小的进行相加

那么,这道题中两个数相加之后,在原有的数组上会少一个位置(搞不明白的去看我的Excel图解),然后我们要寻找方法,怎么去表示这个位置的变化,

我想到的方法就是,利用for循环,直接将相加结果放到两数相加的后一个元素的位置

然后体力+=后一个元素的结果值即可

?? ?for (int x = 0; x < dui-1; x++)
?? ?{
?? ??? ?shu[x + 1] = shu[x] + shu[x + 1];

? ? ? ??? ?tili += shu[x+1];

?为什么这么操作?

x是不断往后的,而我只需要放到后面一个元素,就能保证在接下来的x++中,不会再与前一项有所牵连。

这是第一个操作关系

那么还有一个,就是排序

??? ??? ?for (int y =1; y < dui; y++)
?? ??? ?{
?? ??? ??? ?if (shu[y-1] > shu[y])
?? ??? ??? ?{
?? ??? ??? ??? ?temp = shu[y];
?? ??? ??? ??? ?shu[y] = shu[y-1];
?? ??? ??? ??? ?shu[y-1] = temp;
?? ??? ??? ?}
?? ??? ?}

?注意越界的问题,所以我直接用y为后一项,y-1为前一项来表示了.


我觉得也可以使用while还有冒泡排序,我这个似乎是交换了,欢迎大家贴出这两种方法的代码在评论区撒~


?终止关系

其实就是下面这几句

?? ?for (int x = 0; x < dui-1; x++)
?? ?{??? ???

? ? ? ? ..............

? ? ? ?for (int y =1; y < dui; y++)
?? ??? ?{
?? ??? ??? ?if (shu[y-1] > shu[y])

最后附上我的运行图~

?

欢迎大家来访~

我是广州悠扬,一只奋发跟大佬步伐,并且励志成为优秀程序员的大一娃

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-29 23:20:21  更:2022-01-29 23:21:56 
 
开发: 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 17:49:09-

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