zoukankan      html  css  js  c++  java
  • 【USACO 1.3.2】修理牛棚

    【描述】

    在一个夜黑风高,下着暴风雨的夜晚,farmer John的牛棚的屋顶、门被吹飞了。 好在许多牛正在度假,所以牛棚没有住满。 牛棚一个紧挨着另一个被排成一行,牛就住在里面过夜。 有些牛棚里有牛,有些没有。 所有的牛棚有相同的宽度。 自门遗失以后,farmer John必须尽快在牛棚之前竖立起新的木板。 他的新木材供应商将会供应他任何他想要的长度,但是吝啬的供应商只能提供有限数目的木板。 farmer John想将他购买的木板总长度减到最少。

    给出:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1<= S<=200); 牛棚里牛的总数C(1 <= C <=S);和牛所在的牛棚的编号stall_number(1 <= stall_number <= S),计算拦住所有有牛的牛棚所需木板的最小总长度。 输出所需木板的最小总长度作为答案。

    【格式】

    INPUT FORMAT:

    (file barn1.in)

    1 行: 木板最大的数目M ,牛棚的总数S 和 牛的总数C(用空格分开)  
    2 到 C+1行:  每行包含一个整数,表示牛所占的牛棚的编号。
    

    OUTPUT FORMAT:

    (file barn1.out)

    单独的一行包含一个整数表示所需木板的最小总长度。

    【分析】

    直覺告訴我們應該根據兩牛間的空隙來貪心。

    每次選擇空隙最大的作爲兩個木板的界限最可以了。

    提示:

    1、輸入的牛棚可能不是有序的。

    2、可能會出現M>C的情況,應該要注意到。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <cstring>
     5 #include <algorithm>
     6 const int maxn=300+10;
     7 using namespace std;
     8 int temp[maxn],data[maxn];
     9 int main()
    10 {
    11     int a,b,m,s,c,i,tot=0;
    12     //文件操作 
    13     freopen("barn1.in","r",stdin);
    14     freopen("barn1.out","w",stdout);
    15     scanf("%d%d%d",&m,&s,&c);//輸入
    16     for (i=1;i<=c;i++) scanf("%d",&temp[i]);
    17     sort(temp+1,temp+1+c);//排序
    18     tot=temp[c]-temp[1]+1;
    19     for (i=1;i<c;i++) data[i]=temp[i+1]-temp[i];//計算差值
    20     sort(data+1,data+1+c-1);
    21     for (i=c-1;i>=max(1,c-1-m+2);i--) tot=tot-data[i]+1;
    22     printf("%d",tot);
    23     return 0;
    24 }
  • 相关阅读:
    PostgreSQL Monitor pg_activity
    bzoj2333 [SCOI2011]棘手的操作
    bzoj1499 [NOI2005]瑰丽华尔兹
    bzoj2561 最小生成树
    bzoj2038 [2009国家集训队]小Z的袜子(hose)
    bzoj2002 [Hnoi2010]Bounce 弹飞绵羊
    bzoj3589 动态树
    bzoj4034 [HAOI2015]树上操作
    bzoj4774 修路
    2018.1.14 省选模拟赛
  • 原文地址:https://www.cnblogs.com/hoskey/p/3780792.html
Copyright © 2011-2022 走看看