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;
}