zoukankan      html  css  js  c++  java
  • 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 }
    心之所动 且就随缘去吧
  • 相关阅读:
    vim /home/yuanyc/.bashrc export LC_ALL=zh_CN.UTF-8
    mongodb
    关于RegisterClass和CreateWindow
    c++中sqlite中文路径创建数据库失败的问题
    Layered Window 透明窗体的实现总结
    c++单列模式与线程安全
    Windows下API Hook 技术
    COM编程大致梳理
    关于c++多态
    几个多字节和UNICODE及UTF-8之间相互转化的函数
  • 原文地址:https://www.cnblogs.com/iat14/p/11144166.html
Copyright © 2011-2022 走看看