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 }
心之所动 且就随缘去吧