barn1-section1.3

题目大意

牧牛厂的牛棚是一排多个房间构成的,每头牛独占一个房间,但不是每个房间都有牛。现在厂主打算用木板当作门,然而供应商只愿意提供有限数量的木板,不过每块木板可以任意长。这样就意味着有可能一个木板遮住了好几个房间,但是其中有些房间没有牛,厂主希望这种浪费最少,而且每个有牛的房间都要有门。请给出满足上述条件的最短木板总长度。
输入格式
一行数字,从左到右依次为:可能买到的木板最大的数目M(1<= M<=50);牛棚的总数S(1<= S<=200); 牛棚里牛的总数C(1 <= C <=S);和牛所在的牛棚的编号stall_number(1 <= stall_number <= S)
输出格式
一个数字:拦住所有有牛的牛棚所需木板的最小总长度
样例输入
4 50 18 3 4 6 8 14 15 16 17 21 25 26 27 30 31 40 41 42 43
样例输出
25
( 一种最优的安排是用板拦牛棚3-8,14-21,25-31,40-43)

题解

如果M>=C,很显然每个有牛的牛棚用一块木板,即为所求。
如果M<=C,则如下考虑:如果只有一块木板,那么用这一块木板充当所有的门,如果有两块,怎样最节约,找出最长的一段没有牛的牛棚,将这一段从原先的一块木板中扣出来,这样一块木板就变成了两块,且最节约。更多木板的情况如上考虑

代码

#include<stdio.h>
int main()
{
int M,S,C;
int cow[210];
scanf("%d %d %d",&M,&S,&C);

int i;
for(i=0;i<C;i++)
{
    scanf("%d",&cow[i]);
}
if(M>=C)
    printf("%d\n",C);
else
{
int j,temp;
for(i=0;i<C;i++)
    for(j=0;j<C-i-1;j++)
    {
        if(cow[j]>cow[j+1])
        {
            temp=cow[j];
            cow[j]=cow[j+1];
            cow[j+1]=temp;
        }
    }
int barn[210];
for(i=0;i<C-1;i++)
{
    barn[i]=cow[i+1]-cow[i]-1;
}
for(i=0;i<C;i++)
    for(j=0;j<C-i-1;j++)
    {
        if(barn[j]<barn[j+1])
        {
            temp=barn[j];
            barn[j]=barn[j+1];
            barn[j+1]=temp;
        }
    }
    for(i=0;i<C;i++)
        printf("%d ",cow[i]);
    printf("\n");
    for(i=0;i<C-1;i++)
        printf("%d ",barn[i]);
    printf("\n");

    int len=0;
    len=cow[C-1]-cow[0]+1;
    for(i=0;i<M-1;i++)
        len=len-barn[i];
    printf("%d\n",len);
}
    return 0;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值