题目大意
牧牛厂的牛棚是一排多个房间构成的,每头牛独占一个房间,但不是每个房间都有牛。现在厂主打算用木板当作门,然而供应商只愿意提供有限数量的木板,不过每块木板可以任意长。这样就意味着有可能一个木板遮住了好几个房间,但是其中有些房间没有牛,厂主希望这种浪费最少,而且每个有牛的房间都要有门。请给出满足上述条件的最短木板总长度。
输入格式
一行数字,从左到右依次为:可能买到的木板最大的数目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;
}