修理牛棚(贪心)




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; 

}
 

posted @ 2015-02-16 21:48  martinue  阅读(243)  评论(0编辑  收藏  举报