• 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
    ",ans);
    19 }
    心之所动 且就随缘去吧
  • 相关阅读:
    mysql常用函数
    主程Ry访谈录
    mongodb spring anno 查询
    mongodb 查询少少优化
    jquery table thead drop
    ubuntu 配置java,eclipse ,flex,zend,php,TomCat环境
    mongodb shell
    TCP/IP Sockets in Java 源码
    java 断点下载
    直线生成 DDA
  • 原文地址:https://www.cnblogs.com/iat14/p/11144166.html
Copyright © 2020-2023  润新知