usaco Barn Repair

农夫需要将一串大小相等的畜棚盖起来,但是他只能定做M个木板,并不是所有的畜棚都有牛,所以不需要将所有的畜棚都盖起来。问在将所有有牛畜棚都盖起来且只能定做M个木板的情况下,使用的M个木板最少能盖多少个畜棚。

贪心的找出M-1个最大(相连且没有牛的畜棚区间),这些区间总和就是不许要盖住的总和,然后用编号最小的被占畜棚和编号最大的被占畜棚之间的所有畜棚总数减去刚刚得到的不许要盖住的总和就是正解。

/*
ID: modengd1
PROG: barn1
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <queue>
using namespace std;

int main()
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    int M,S,C,sum,no_occupied;
    int input[201];
    priority_queue<int> Q;
    scanf("%d%d%d",&M,&S,&C);
    for(int i=0;i<C;i++)
    {
        scanf("%d",&input[i]);
    }
    sort(input,input+C);
    sum=input[C-1]-input[0]+1;
    for(int i=1;i<C;i++)
    {
        if(input[i]-input[i-1]>1)
            Q.push(input[i]-input[i-1]-1);
    }
    no_occupied=0;
    M=min(M,C);//有可能出现木板数量大于被占畜棚的情况
    for(int i=0;i<M-1;i++)
    {
        no_occupied+=Q.top();
        Q.pop();
    }

    cout<<sum-no_occupied<<endl;
    return 0;
}

  

posted on 2015-08-27 11:04  insaneman  阅读(157)  评论(0)    收藏  举报

导航