2011年8月7日 星期日

產品包裝

內容 : 
某工廠生產4種正立方體產品,邊長分別為1,2,3,4公分,該工廠的包裝箱為4*4*4公分(不計算包裝箱厚度),現在有若干筆訂單,每一筆訂購單可能包括各種產品但數量可能不同,請計算每一筆訂購最少各需要多少的包裝箱。

輸入說明 :
每行是一筆訂購單,由四個整數組成,每個整數以一個空白間格,依序分別代表邊長1,2,3,4公分的產品數量,每一個數量均為不大於20000的非負整數,以一個空白隔開。

輸出說明 :
輸出各筆訂購的最少包裝箱數目,每一筆一行。

範例輸入 :
5 4 8 2 
12 14 32 7
範例輸出 :

11 
41

6 則留言:

  1. 做完回去看學長的做法,
    學長的做法有點不懂=口=!!

    Private Sub Form_Load()
    Dim A(4) As Integer
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, A(1), A(2), A(3), A(4)
    ans = A(4)
    Do
    ans = ans + 1
    A(3) = A(3) - 1
    If A(1) - 37 < 0 Then A(1) = 0 Else A(1) = A(1) - 37
    Loop Until A(3) = 0



    If A(2) Mod 8 = 0 Then
    ans = ans + A(2) \ 8
    Else
    ans = ans + A(2) \ 8 + 1
    End If



    Print #2, ans

    Loop
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  2. 佑好,
    程式不正確。(原先我還以為正確呢,邊寫下面改進點時發現,剩下的a(1)呢?如果a(1)很大呢?)

    改進點:
    Do
    ans = ans + 1
    A(3) = A(3) - 1
    If A(1) - 37 < 0 Then A(1) = 0 Else A(1) = A(1) - 37
    Loop Until A(3) = 0
    這個迴圈沒必要,直接改成3行程式
    ans=ans+a(3)
    a(1)=a(1)-a(3)*37
    if a(1)<0 then a(1)=0

    回覆刪除
  3. 熊掌好,

    對好小細節沒注意到,
    重寫了一次

    改進點
    一個增
    一個減有看出關係了
    我把if a(1)<0 then a(1)=0也給省略掉了
    應該沒有關係吧

    Private Sub Form_Load()
    Dim A(4) As Integer
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do While Not EOF(1)
    Input #1, A(1), A(2), A(3), A(4)
    '4
    ans = A(4)

    '3
    ans = ans + A(3)
    A(1) = A(1) - (A(3) * 37)

    '2
    If A(2) Mod 8 = 0 Then
    ans = ans + A(2) \ 8
    Else
    ans = ans + A(2) \ 8 + 1
    If A(1) > 0 Then A(1) = A(1) - (64 - (A(2) Mod 8) * 8)
    End If

    '1
    Do While A(1) > 0
    ans = ans + 1
    A(1) = A(1) - 64
    Loop

    Print #2, ans

    Loop
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  4. 佑好,
    程式正確。
    改進點1:
    If A(1) > 0 Then A(1) = A(1) - (64 - (A(2) Mod 8) * 8)
    這兒反而可以不用管a(1)原本值,反正就去減。
    (如原先小於0,你要做if一個指令,如果大於0,你要做2個指令)
    (還不如,直接做1個指令,反正,下面還會檢查一次)
    改進點2:
    Do While A(1) > 0
    ans = ans + 1
    A(1) = A(1) - 64
    Loop
    這兒如果是a(1)是20000你要迴圈做幾次啊?
    直接數學運算一下就好了吧。
    if a(1)>0 then
    ans=ans + a(1) \64
    if a(1) mod 64 <>0 then ans=ans +1
    end if

    回覆刪除
  5. 熊掌好,

    對耶就跟我省略的
    if a(1)<0 then a(1)=0
    一樣
    ans=ans + a(1) \64這邊方法跟3.一樣
    謝謝老師了

    If A(2) Mod 8 = 0 Then
    ans = ans + A(2) \ 8
    Else
    ans = ans + A(2) \ 8 + 1
    A(1) = A(1) - (64 - (A(2) Mod 8) * 8)
    End If

    '1
    If a(1)>0 then
    ans=ans + a(1) \64
    If a(1) mod 64 <>0 then ans=ans +1
    End if

    回覆刪除
  6. Dim Size As Integer, a1, a2, a3, a4, ans, sp


    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2


    Size = 4 * 4 * 4

    Do While Not EOF(1)
    Input #1, a1, a2, a3, a4
    ans = 0


    ans = a4 + a3
    sp = a3 * 37
    sp = sp - a1

    If a2 \ 8 <> 0 And a2 Mod 8 <> 0 Then ans = ans + (a2 \ 8) + 1: sp = sp + 64 - ((a2 Mod 8) * 8)
    If a2 \ 8 <> 0 And a2 Mod 8 = 0 Then ans = ans + (a2 \ 8): sp = sp + 64 - ((a2 Mod 8) * 8)
    If a2 \ 8 = 0 Then ans = ans + 1: sp = sp + (64 - a2)

    If sp < 0 And sp Mod 64 = 0 Then ans = ans + (sp \ 64)
    If sp < 0 And sp Mod 64 <> 0 Then ans = ans + (sp \ 64) + 1


    Print #2, ans


    Loop
    Close
    Close
    End Sub

    回覆刪除