38 修理牛棚

問題描述 :

在一個暴風雨的夜晚,農民約翰的牛棚的屋頂、門被吹飛了。 好在許多牛正在度假,所以牛棚(牛棚的總數S:1<= S<=200)沒有住滿。 剩下的牛一個緊挨着另一個被排成一行安置在有屋頂的牛棚來過夜。 所以有些牛棚裏有牛,有些沒有。

所有的牛棚有相同的寬度,且寬度設爲1。 因爲有些門遺失,農民約翰需要架起新的木板作爲門。 他的新木材供應者將會供應他任何他想要的長度,但是供應者只能提供有限數目的木板。 農民約翰想將他購買的木板總長度減到最少。

計算攔住所有有牛的牛棚所需木板的最小總長度。

輸出所需木板的最小總長度作爲的答案。

說明:攔住一個牛棚需要的木板長度爲1,攔住相鄰的三個牛棚則需要木板長度爲3。

比如有牛的牛棚編號爲:

3 5 8 10 11

並且只能使用兩塊木板,

則第一塊木板從3到5,長度爲3,

第二塊木板從8到11,長度爲4,

因此,需要木板的總長度爲7。

輸入說明 :

第 1 行: M 和 C(用空格分開)

第 2 到 C+1行: 每行包含一個整數,表示牛所佔的牛棚的編號。

其中:

可能買到的木板最大的數目:M(1<= M<=50);

需要安置的牛的數目C(1<= C <=S)

安置後牛所在的牛棚的編號stall_number(1<= stall_number <= S)。

輸出說明 :

單獨的一行包含一個整數表示所需木板的最小總長度

輸入範例 :

3 5
2
4
6
8
7

輸出範例 :

5

c源碼:

#include<stdio.h>
int main()
{
	int i,j,n,m,a[220],t,s,b[220],max;
	while(scanf("%d%d",&m,&n)!=EOF)
	{  memset(a,0,220);
	   memset(b,0,220);
	      for(i=0;i<n;i++)
           scanf("%d",&a[i]);

      for(i=0;i<n;i++)
		  for(j=0;j<n-i-1;j++)
			  if(a[j]>a[j+1])
			  {
			    t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			  }
	for(i=0;i<n-1;i++)
	{ b[i]=a[i+1]-a[i];}//間距

      for(i=0;i<n-1;i++)
		  for(j=0;j<n-i-2;j++)
			  if(b[j]<b[j+1])
			  {
			    t=b[j];
				b[j]=b[j+1];
				b[j+1]=t;
			  }

	t=1;//一塊木板
	s=a[n-1]-a[0]+1;//最大長度
	i=0;
     while(t<m&&i<n-1)
	 { if(b[i]>1)
	 {s=s-b[i]+1;
	 t++;}
	   i++;
	}
	
	 printf("%d\n",s);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章