关于贪心的一些小知识

贪心其实没有大家所说的那么复杂,他并不是某种函数之类的,只是一种算法。

贪心它的主要思想就是局部最优解等于全局最优解

每一步达到最优解就相当于全局都是最优解了,核心大概是这个意思(只是一些简单的)。

它只贪眼前(每步最优解),所以叫贪心。

贪心很经典的一个题目啊:排队接水。每个人接水时间不同,怎样才能使平均等待时间最短。这道题大家应该都知道,时间短的在前面,长的留在后面。这就是从每个人等待时间(局部)变短使平均等待时间(全局)变短

贪心恰好相反的一个算法就是动态规划,与贪心不同,它是在意全局最优解而不是局部最优解。所以有些时候要用动态规划而不能用贪心,用贪心需要证明局部最优解是否能导致全局最优解。说远了

继续说贪心啊,它主要用到我们上次学的sort,毕竟想要局部最优解还是要排个序嘛!

举个栗子:

【题目描述】 输入一个高精度正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小

输出新的正整数。(n不超过240位)

输入数据均不需判错。

【输入】

n

s

【输出】

最后剩下的最小数。

【输入样例】

175438

4

【输出样例】

13

怎么样,是不是感觉拆分一下就行了?不!我给你们举几个栗子:10902,拆两个数字,最后拆完是2;1000,拆一位数字,最后拆完是0;3245,拆一位数字,最后拆完是245!

对,这道题就是那么的奇妙。但你仔细思考,发现并不是那么的难。

接下来我说一下思路。

如果后一位数比前一位数字小,把前一位数字删掉。这样原数位就变小了,既能删掉一个数位也可以使数位的数字变小

是不是感觉解决了?不!如果是1000,差一位数字,那按照我们刚才的思路来的话,最后输出的是000。所以我们还要去掉前面的零

判断,如果这个数位为0的话,使i++,最后从i开始输入

但是如果这样的话,1000最后就不会输出了。因为数都被删除完了,我们只需要判断到末尾数位的前一位就行了,这样1000最后输出的就是0。

这道题就这样解决了。

这个也是由局部最优解到全局最优解的。每次都删除一个能使这个数变得最小的一个数位,最后就得到最小的这个数

思路我说了,代码给你们。

好了,这就是今天的内容,你们学废了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值