luogu1209 修理牛棚 贪心

看到木板最大数目,容易下意识想到二分。但是我们冷静思考下,这道题怎么样才能使总长度最短。

因为有些牛不在,所以有些牛棚是不需要覆盖木板的。如果能每个牛棚分单独一个木板,一定总长度是最小的。但是由于木板数量有限制,所以我们有时只能用一个比较长的木板的时候,顺便把没有牛的牛棚也覆盖了。就造成了浪费。所以一定是使用最大数目木板的。

我们考虑,如果第一头牛在a[1],最后一头牛在a[c]。我们先考虑,把这个这一段放置一整个木板,显然这是最不优秀的方法。因为我们只用了一个木板。我们考虑这一段内,有些两头牛之间的一段牛棚都没有牛,那么我们把原先的一整个木板拆成两个,就可以使得这一个没有牛的区间不放木板,从而节省了长度。所以就相当于,每多一块木板,就能使得区间内一段没有牛的部分,可以不覆盖木板。我们就对所有没有牛的区间排一个序,然后优先去删掉较大的,删m-1个即可。

注意题目中输入的a数组可能无序,需要排序后使用

 1 #include <cstdio>
 2 #include <algorithm> 
 3 using namespace std;
 4 int m,s,c,ans;
 5 int a[210],b[210];
 6 int main()
 7 {
 8     scanf("%d%d%d",&m,&s,&c);
 9     for (int i = 1;i <= c;i++)
10         scanf("%d",&a[i]);
11     sort(a + 1,a + c + 1);
12     ans = a[c] - a[1] + 1;
13     for (int i = 1;i <= c - 1;i++)
14         b[i] = a[i + 1] - a[i] - 1;
15     sort(b + 1,b + c);
16     for (int i = c - 1;i >= c - m + 1;i--)
17         ans -= b[i];
18     printf("%d\n",ans);
19 }

 

posted @ 2019-07-06 21:14  IAT14  阅读(281)  评论(0编辑  收藏  举报