贪心算法例题
2021-3-27上课总结
一、删数问题
题目描述
输入一个高精度的正整数n(≤240位),去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。 (仔细思考,这道题并不是很水)
输入格式
两行,每行一个整数: n(n为小于240位的整数) s
输出格式
最后剩下的最小数。
分析:
1、相信许多人第一次看见这道题都觉得它很简单,不是只要sort排序一下,再删除最后s位数不就好了嘛?其实远不止如此;
2、如果按照第一条分析的来写,那么就会成功的报零,不要问我咋知道。这样做的漏洞是改变了数位次序,不符合题意,所以就会错;
3、首先看题目,输入的是高精度数,所以用字符串还是很香的,然后需要连续寻找这样一对数:前一个数比后一个数大,然后删除前一个数。(注意:因为有可能从头到尾循环完了以后还有这样的数,所以要循环s次)
具体过程:
1、输入字符串n和s,因为在运算过程中n.size()这个长度函数无法直接运算,所以我们要开个备份len来运算;
2、开始循环:第一重,从1到s,循环次数;第二重:从前往后枚举,只要找到一对前比后大的数就删除前数,然后break(因为要删掉s个数,所以break可以有效控制次数);
3、因为可能有前导零,所以输出要长个心眼。
二、三值排序
题目描述:
排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。
输入格式
第 1 行: 奖牌个数N (1 <= N <= 1000) 第 2 行到第 N+1 行: 每行一个数字,表示奖牌。共N行。(1…3)
输出格式
共一行,一个数字。表示排成升序所需的最少交换次数。
分析:
1、这道题看似很简单,但实际上需要一点策略;
2、这道题不能用sort,这样会导致后面的运算超时;
3、要记录123的个数,方便统计。
具体步骤:
1、输入,统计个数;
2、策略: 先从s1开始循环,一直到n-s3(s3是3的个数,n-s3相信大家能理解),如果里面有三,s++(说明在这一段里有s个3,要换s次),再从n-s3开始循环,到n,如果里面有二,ss++(说明在这一段里有ss个2,要换ss次);
3、从0到s1,如果他不是一,sss++;
4、策略: 输出sss加s与ss的最大值。理由: s与ss的最大值说明至少要循环这么多次才能让3或2排好序,加上sss说明至少要这么多次才能让1与 2或3排好序,这样才能保证三个都排好序。
__EOF__

本文链接:https://www.cnblogs.com/best-brain/p/18006588.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具