修理牛棚(贪心)
description
这是一个月黑风高的晚上, 狂风把小韩的牛棚摧毁了. 但幸运的是,有些牛在休假,所以牛棚不是满的。
牛棚是一排的。 有的牛棚里有牛,有的没有。所有的牛棚都是相同的宽度(为一个单位)。
现在小韩要最快的修理牛棚的门,需要弄些木板来封住出口,以免牛跑出去。木材提供商可以提供给他各种宽度的木板, 但是数量有限。 小韩没多少钱,希望把购买木板的钱尽量省一点,也就是木板的总宽度最短。
input
你一行输入三个数M,S,C。M(1<=M<=50),代表最多可以购买的木板的数量。
S(1<=S<=200),牛棚的总数。C(1<=C<=S),代表现在还在牛棚的牛的数量。然后有C行,每行输入一个数Si,表示编号为Si的牛棚里有牛。
output
输出一个数T,为锁住当前牛棚里所有牛而花费的所有木板的总宽度。
sample_input
4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43
sample_output
25
hint
对于样例,我们可以得出最小宽度的4个木板,3-8,14-21,25-31,40-43,总计25的宽度
此题需要多思考,其实按照普通思路也应该能写出来,不过个人能力有限硬是wa到底。在网上见到某个这题的代码深受启发。其思路主要是将所有牛棚先搭上一个木板,再去掉区间。其中最重要的一点是区间并不需要去寻找具体是哪一个区间(刚开始思维受限于此总想着怎样去找具体的区间,可事实是根本不需要儿!)所以将所有区间大小一个排序就搞定儿!那么用最大木板减去该减掉的区间这题就搞定啦~!
下面附上代码:
#include <iostream> #include <algorithm> using namespace std; int w[250]; int o[250]; int z; int main() { int m, s, c; while (cin >> m >> s >> c) { for (int i = 0; i < c; i++) cin >> w[i]; sort(w, w + c); for (int i = 1; i < c; i++) o[i] = w[i] - w[i - 1]; sort(o + 1, o + c); z = 0; for (int i = 1; i < m && i < c; i++) z += o[c - i] - 1; int sum = w[c - 1] - w[0] + 1; cout << sum - z << endl; } return 0; }
持续更新博客地址:
blog.csdn.net/martinue