USACO 1.3 Barn Repair

Barn Repair

It was a dark and stormy night that ripped the roof and gates off the stalls that hold Farmer John‘s cows. Happily, many of the cows were on vacation, so the barn was not completely full.

The cows spend the night in stalls that are arranged adjacent to each other in a long line. Some stalls have cows in them; some do not. All stalls are the same width.

Farmer John must quickly erect new boards in front of the stalls, since the doors were lost. His new lumber supplier will supply him boards of any length he wishes, but the supplier can only deliver a small number of total boards. Farmer John wishes to minimize the total length of the boards he must purchase.

Given M (1 <= M <= 50), the maximum number of boards that can be purchased; S (1 <= S <= 200), the total number of stalls; C (1 <= C <= S) the number of cows in the stalls, and the C occupied stall numbers (1 <= stall_number <= S), calculate the minimum number of stalls that must be blocked in order to block all the stalls that have cows in them.

Print your answer as the total number of stalls blocked.

PROGRAM NAME: barn1

INPUT FORMAT

Line 1: M, S, and C (space separated)
Lines 2-C+1: Each line contains one integer, the number of an occupied stall.

SAMPLE INPUT (file barn1.in)

4 50 18
3
4
6
8
14
15
16
17
21
25
26
27
30
31
40
41
42
43

OUTPUT FORMAT

A single line with one integer that represents the total number of stalls blocked.

SAMPLE OUTPUT (file barn1.out)

25

[One minimum arrangement is one board covering stalls 3-8, one covering 14-21, one covering 25-31, and one covering 40-43.]

题解:简单说一下我的思路

算出相邻放牛的两个牛棚的距离,给它们做降序排序。前M个大的距离两牛棚之间没有模板。简单的贪心。

注:优先队列默认排序是升序,sort函数的排序默认是降序。 所以我两个结构体里的排序函数逻辑不一样。

/*
ID: cxq_xia1
PROG: barn1
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
int M,S,C;
struct stall
{
    int num;                                //牛所在牛棚的编号
    bool isIncision;                        //模板在该牛棚 是否分割
    friend bool operator < (stall a,stall b)
    {
        return a.num<b.num;
    }
};

struct node                                  //结构体里存 相邻两个放牛的牛棚里相隔的距离
{
    int IncisionNum;
    int dis;

    friend bool operator < (node a,node b)
    {
        return a.dis<b.dis;
    }
};
int main()
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    node tmpDis1,tmpDis2;
    stall stall_number[202];
    priority_queue<node> q;
    int ans=0;
    int start;
    bool isStart=true;

    cin >> M >> S >> C;

    cin>>stall_number[0].num;
    stall_number[0].isIncision=false;

    for(int i=1;i<C;i++)
    {
        cin >> stall_number[i].num;
        stall_number[i].isIncision=false;
    }
    sort(stall_number,stall_number+C);

    for(int i=1;i<C;i++)
    {
        tmpDis1.IncisionNum=i-1;
        tmpDis1.dis=stall_number[i].num-stall_number[i-1].num;
        q.push(tmpDis1);
    }
    for(int i=0;i<M-1;i++)
    {
        tmpDis2=q.top();
        q.pop();

        stall_number[tmpDis2.IncisionNum].isIncision=true;
    }

    start=stall_number[0].num;
    for(int i=0;i<C;i++)
    {
        if(!stall_number[i].isIncision)
        {
            if(isStart)
            {
                start=stall_number[i].num;
                isStart=false;
            }
        }
        else
        {
            ans+=(stall_number[i].num-start+1);
            isStart=true;
            start=stall_number[i+1].num;
        }
    }
    ans+=(stall_number[C-1].num-start+1);
    cout << ans << endl;
    return 0;
}

  

时间: 2024-10-28 10:51:13

USACO 1.3 Barn Repair的相关文章

USACO 1.3 Barn Repair(贪心)

这道题同样也是贪心 要使木板总长度最少,就要使未盖木板的长度最大. 我们先用一块木板盖住牛棚,然后,每次从盖住的范围内选一个最大的空隙,以空隙为界将木板分成两块,重复直到分成m块或没有空隙. /* ID:twd30651 PROG:barn1 LANG:C++ */ #include<iostream> #include<fstream> #include<stdlib.h> //#define DEBUG using namespace std; int M; int

USACO Section1.3 Barn Repair 解题报告

barn1解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有一列牛棚,编号从1到S,相邻的牛棚紧挨着(间距为0),每个牛棚长度是一个单位. 其中有C头牛,分别在各自的牛棚中,不存在多个牛挤

USACO 1.3 Barn Repair (动态规划再写次)

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

Usaco 1.3.2 修理牛棚(Barn Repair)

  Barn Repair 题意:在一个夜黑风高,下着暴风雨的夜晚,农民约翰的牛棚的屋顶.门被吹飞了. 好在许多牛正在度假,所以牛棚没有住满. 剩下的牛一个紧挨着另一个被排成一行来过夜. 有些牛棚里有牛,有些没有. 所有的牛棚有相同的宽度. 自门遗失以后,农民约翰必须尽快在牛棚之前竖立起新的木板. 他的新木材供应商将会供应他任何他想要的长度,但是供应商只能提供有限数目的木板. 农民约翰想将他购买的木板总长度减到最少. 给出:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1&l

【USACO 1.3】Barn Repair

贪心,去掉最大的min(m,c)-1个间隔 /******************************************* TASK: barn1 LANG: C++ Created Time: 2016/9/9 14:36:17 *********************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> u

usaco Barn Repair

农夫需要将一串大小相等的畜棚盖起来,但是他只能定做M个木板,并不是所有的畜棚都有牛,所以不需要将所有的畜棚都盖起来.问在将所有有牛畜棚都盖起来且只能定做M个木板的情况下,使用的M个木板最少能盖多少个畜棚. 贪心的找出M-1个最大(相连且没有牛的畜棚区间),这些区间总和就是不许要盖住的总和,然后用编号最小的被占畜棚和编号最大的被占畜棚之间的所有畜棚总数减去刚刚得到的不许要盖住的总和就是正解. /* ID: modengd1 PROG: barn1 LANG: C++ */ #include <io

[USACO1.3]修理牛棚 Barn Repair (贪心)

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

洛谷P1209 [USACO1.3]修理牛棚 Barn Repair

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

1.3.2 Barn Repair

It was a dark and stormy night that ripped the roof and gates off the stalls that hold Farmer John's cows. Happily, many of the cows were on vacation, so the barn was not completely full. The cows spend the night in stalls that are arranged adjacent