贪心

今天,把所有的贪心刷完了,挺爽。也对贪心有了进一步的理解

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解

贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

来一道题:

排序是一种很频繁的计算任务。现在考虑最多只有三值的排序问题。一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌排序的时候。在这个任务中可能的值只有三种1,2和3。我们用交换的方法把他排成升序的。 写一个程序计算出,给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数。

这一道题怎做呢?

我们可以来一组栗子:

9

2 2 1 3 3 3 2 3 1

排序后是

9

1 1 2 2 2 3 3 3 3

在观察一下,发现如果位置不再这个序列上的总数/2便是最少的交换数(如果是奇数,就+1在除),不相信,就再来几组

上代码:


再来一道

有一块n××m的矩形巧克力,准备将它切成n××m块。巧克力上共有n-1条横线和m-1条竖线,你每次可以沿着其中的一条横线或竖线将巧克力切开,无论切割的长短,沿着每条横线切一次的代价依次为y1,y2,…,yn-1,而沿竖线切割的代价依次为x1,x2,…,xm-1。例如,对于下图6××4的巧克力,
pic

我们先沿着三条横线切割,需要3刀,得到4条巧克力,然后再将这4条巧克力沿竖线切割,每条都需要5刀,则最终所花费的代价为y1+y2+y3+4*(x1+x2+x3+x4+x5)。 当然,上述简单切法不见得是最优切法,那么怎样切割该块巧克力,花费的代价最少呢?

也是一个很简单的贪心,将值按从大到小排序一个个的加便可(我是一个个搜)


再来一道题

FJ 有 N (1 <= N <= 50,000)头牛,FJ的草地可以认为是一条直线。 每只牛只喜欢在某个特定的范围内吃草。第i头牛喜欢在区间(S_i, E_i)吃草, (1 <= S_i < E_i; S_i < E_i<= 100,000,000).

奶牛们都很自私,他们不喜欢和其他奶牛共享自己喜欢吃草的领域,因此FJ要保证任意两头牛都不会共享他们喜欢吃草的领域。如果奶牛i和奶牛j想要同时吃草,那么要满足: S_i >= E_j 或者 E_i <= S_j. FJ想知道在同一时刻,最多可以有多少头奶牛同时吃草?

下面的样例有5头奶牛:
pic

这5头奶牛的范围分别是:(2, 4), (1, 12), (4, 5), (7, 10) (7, 8)。 显然,第1、3、4,共3只奶牛可以同时吃草,第1、3、5也可以。

这一道题的思路也差不多,把右端点从小到大排序一遍,一个个的判断右端点的数和与下一个是否重合如果重合便不选,不重合就选

为啥呢?很简单,当你取了一个最小的右端点时,如果与下面一个重合,那么在他前面的右端点也一定重合(思考一下为什么

如果不重合,那么在他前面的右端点不一定重合,所以他最优解。

代码:



猜你喜欢

转载自blog.csdn.net/qq_40669010/article/details/79994051