[USACO][Section 1.3][贪心] Barn Repair

题目大意:

有s个牛棚,其中c个有牛,共有m个任意长度的木板用来封住所有有牛的牛棚。要求编程求出至少需要多长的木板。

思路:

尽量增加木板数量以节约木板长度,最佳情况是一个木板封住一个有牛的牛棚,即用c个木板。总长度为c个单位长度。

若木板数量小于c,那么最多可以用m个木板。可以想象为将一个“从序号最小的牛棚一直到序号最大的牛棚的全部封住的木板”分成m份,也就是去掉其中m-1段。

按照贪心思想,应该按由大到小顺序去掉前m-1个“两个相邻有牛的牛棚之间的间隔”。

代码:

/*
ID: lujunda1
LANG: C++
PROG: barn1
*/
#include
#include
#include
#include
#include
using namespace std;
int stalls[200],dis[200];
//自定义cmp比较函数,从大到小排序。 
int cmp(const void* m,const void* n)
{
    return *(int*)n-*(int*)m;
}
int main()
{
    freopen("barn1.in","r",stdin);
    freopen("barn1.out","w",stdout);
    //分别用min和max记录序号最小和最大的牛棚。 
    int m,s,c,min=200,max=0;
    scanf("%d%d%d",&m,&s,&c);
    for(int i=0;istalls[i]?max:stalls[i];
    }
    //当最大木板数量大于等于有牛的牛棚的数量时,可以用一个木板补一个牛棚。 
    if(m>=c)
    {
        printf("%d\n",c);
        return 0;
    }
    //有牛的牛棚的序号可能不是按照顺序给出的,因此需要排序。 
    qsort(stalls,c,sizeof(stalls[0]),cmp);
    //将两个牛棚之间的间隔存储起来并按由大到小顺序排序。 
    for(int i=0;i	

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注