2011年8月4日 星期四

[ACM 591] Box of Bricks

 內容 :

3歲的小明喜歡玩他的方塊積木,他總是把方塊疊在一起形成高度不一的方塊堆。然後他說:這是一面牆。5歲的姊姊小美聽到了就跟小明說:真正的牆高度應該要一樣才行。小明聽了覺得有道理於是決定要搬動一些方塊使所有方塊堆的高度一樣。如下圖。由於小明是個懶惰的小孩,他想要搬動最小數目的方塊以達成這個目的,你能幫助他嗎?

 

 

輸入說明 :

輸入包含好幾組資料,每組資料有2行,第一行有一個數字n,代表有幾堆方塊。第二行有n個數字分別代表這n堆方塊的高度hi。你可以假設1<=n<=50 1<=hi<=100
方塊的總數一定可以整除堆數
n,也就是說一定可以使所有的方塊堆同樣高度。
如果輸入的
n=0,代表輸入結束。 

輸出說明 :

對每一組輸入資料,首先輸出一行這是第幾組測試資料,下一行為"The minimum number of moves is k." k在這裡就是需搬動方塊最小的數目以使所有的方塊堆同一高度。每組測試資料後亦請空一行。請參考Sample Output. 

範例輸入 :


6
5 2 4 1 7 5
3
1 1 1
0

 

範例輸出 :

Set #1
The minimum number of moves is 5.

Set #2
The minimum number of moves is 0.
 




/**********************************************************************************/
/*  Problem: c067 "Box of Bricks" from ACM 591                                    */
/*  Language: C                                                                   */
/*  Result: AC (20ms, 358KB) on ZeroJudge                                         */
/*  Author: diiuuli520 at 2008-07-17 22:19:53                                     */
/**********************************************************************************/
 
 
#include<stdio.h>
#include<stdlib.h>
 
int main(void)
    int a,b[50],c,x,y=0,i;
    scanf("%d",&a); 
    while(a!=0){ 
        c=0; 
        x=0;
        y++; 
        for(i=0;i<a;i++){ 
           scanf("%d",&b[i]);
           c+=b[i];
           }
        c=c/a;
        for(i=0;i<a;i++){ 
           if(b[i]<c)
             x+=c-b[i];
           }
        printf("Set #%d\n",y);            
        printf("The minimum number of moves is %d.\n\n",x);
        scanf("%d",&a); 
        } 
      return 0;
    } 

沒有留言:

張貼留言