2011年8月4日 星期四

隔熱紙

內容 :
喵嗚建設公司最近由北到南蓋了一整排共n棟的大樓,且每棟大樓是緊緊貼在一起的
而喵嗚建設公司希望能夠帶給住戶舒適的住宅環境,因此決定在東面窗上貼滿隔熱紙
然而預算有限,不能有任何隔熱紙被浪費,又切割隔熱紙是一向充滿麻煩的工程
你可以幫喵嗚建設公司算出至少要幾張矩形的隔熱紙才能貼滿整排大樓的東側嗎?

輸入說明 :
第一行有一個正整數 n(n<=100000),代表有幾棟大樓
接下來n行每行有兩個正整數(<=1,000,000,000),依序代表每棟大樓的寬度及高度
輸出說明 :
輸出最少所需要的隔熱紙數
範例輸入 :

5
1 2
1 3
2 2
2 5
1 4
範例輸出 :

4

5 則留言:

  1. 圖畫出來就好懂了:)。

    Dim S, E, Min
    Dim ans
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Input #1, N
    List1.AddItem "佔"
    ans = 0

    For i = 1 To N
    Input #1, W, H
    List1.AddItem H
    Next i

    Do
    Call SE
    Call C(S, E)
    Loop Until OK() = False

    Print #2, ans

    Close #2
    Close #1
    End
    End Sub

    Function OK() As Boolean
    P = False
    For i = 1 To List1.ListCount - 1
    If Val(List1.List(i)) <> 0 Then P = True: Exit For
    Next i
    OK = P
    End Function

    Sub SE()
    S = 0: E = 0: Min = 0
    For i = 1 To (List1.ListCount - 1)
    L = Val(List1.List(i))
    If L = 0 And S <> 0 And E <> 0 Then Exit For
    If L <> 0 Then
    If Min = 0 Or (Min > L And L <> 0) Then Min = L
    If S = 0 Then S = i
    E = i
    End If
    Next i
    End Sub

    Sub C(A, B)
    For i = A To B
    List1.List(i) = Val(List1.List(i)) - Min
    Next i
    ans = ans + 1
    End Sub

    回覆刪除
  2. 佑好,
    題目看不懂,到底隔熱紙多大張呢?
    (還有小問題就算了,隔熱紙是要貼「窗」的,和大樓高、寬,有什麼關係?)
    而且,你的程式中,只處理「高度」?寬度呢?

    回覆刪除
  3. 熊掌好,

    應該像這樣吧。

    http://a3.sphotos.ak.fbcdn.net/hphotos-ak-ash4/297849_250306284992623_100000397616290_818242_8315674_n.jpg

    而我是這樣處理。

    http://a5.sphotos.ak.fbcdn.net/hphotos-ak-ash4/301602_250307304992521_100000397616290_818243_5493336_n.jpg

    回覆刪除
  4. 佑好,
    題目的確和你畫的圖意思相符。那麼你的程式是正確的。
    (我還是覺得和現實不符,至少不同大小的矩形的隔熱紙,就不用切割嗎,不過,算了,就是個題目而已,不一定要符合現實的。)

    回覆刪除
  5. Dim B, minB
    Private Sub Form_Load()
    Me.Hide
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Input #1, ti
    ReDim a(ti), B(ti)
    For i = 1 To ti
    Input #1, x, y
    B(i) = y
    Next

    Dim Fin As Boolean, ans

    Do
    Fin = False
    Call Min(ti)
    If minB = 0 Then Exit Do
    For i = 1 To ti
    If Fin = True And B(i) = 0 Then Exit For
    If B(i) >= minB Then Fin = True: B(i) = B(i) - minB

    Next
    If Fin = True Then ans = ans + 1

    Loop


    Print #2, ans







    Close
    Close
    End
    End Sub


    Sub Min(a)

    minB = 0
    ReDim x(a)
    For i = 1 To a
    x(i) = B(i)
    Next

    For j = 1 To a
    For i = 1 To a - 1
    If x(i) > x(i + 1) Then
    tmp = x(i)
    x(i) = x(i + 1)
    x(i + 1) = tmp
    End If
    Next
    Next


    For i = 1 To a
    If x(i) > 0 Then minB = x(i): Exit For
    Next


    End Sub

    回覆刪除