2010年3月5日 星期五

2010/03/02 蝸牛爬竿問題(snail)

問題敘述

蝸牛沿著竹竿底部往上爬,繳幾天可以爬到竹竿頂端呢?先看看以下的範例:
一隻蝸牛從6 公尺長的竹竿底部往上爬,已知這隻蝸牛從太陽出來到太岔下山可以往上爬3 公尺,太陽下山後到隔天太陽昇起前是蝸牛的休息時間,在這段休息時間內蝸牛會下滑1 公尺。而且,蝸牛的疲勞系為10 (%),這表示從第二天開始,蝸牛每天都會少爬3 * 10 % = 0.3 公尺。請問蝸牛在第幾天以爬到竹竿頂端呢?
從下表可以看出這隻蝸牛在第三天可以爬到竹竿的頂端。天數起始高度可爬行距離累積高度下滑後高度

1 0.0 3.0 3.0 2.0
2 2.0 2.7 4.7 3.7
3 3.7 2.4 6.1

你的任務是找出蝸牛爬竿的通解,根據下列條件限制算出蝸牛在第幾天時可以順利爬到竹竿頂端或是失敗?

條件限制
1. 竹竿的高度介於6 ~ 100 公尺之間。
2. 第一天可以往上爬行的距離介於0 ~ 100 公尺之間。
3. 休息時下滑距離介於0 ~ 99 公尺之間。
4. 疲勞系數介於0 ~ 99 (%) 之間。
5. 爬行過程㆗如果下滑觸地 (高度<= 0),則判定為失數(Fail)。

輸入檔格式
輸入檔可以是一個或是多個狀況,每行代表一個狀況。每行包含四個正整數 H、U、D 和F 各以一個空白隔開;當H = 0 時代表輸入檔的結束,否則H 代表竹竿的高度,U 代表第一天蝸牛可以爬行的距離,D 代表蝸牛休息時下滑的距離,F 代表疲勞係數。

輸出檔格式
對於每一個測試狀況,輸出檔都要輸出一行判斷蝸牛成功(success)或是失敗(fail),以及這是發生在第幾天,格式如輸出範例。

輸入範例
6 3 1 10
10 2 1 50
12 6 3 10
0 0 0 0

輸出範例
success on day 3
fail on day 3
success on day 5

5 則留言:

  1. 看小說時,看到這個,「哥德巴赫猜想」,是不是有趣些?
    哥德巴赫猜想是數論中存在最久的未解問題之一。其陳述為:

    任一大於 2 的偶數,都可表示成兩個質數之和。

    將一給定的偶數表示成兩個質數之和被稱之為此數的哥德巴赫分割。例如,

    4 = 2 + 2
    6 = 3 + 3
    8 = 3 + 5
    10 = 3 + 7 = 5 + 5
    12 = 5 + 7
    14 = 3 + 11 = 7 + 7


    換句話說,哥德巴赫猜想主張每個大於等於 4 的偶數都是哥德巴赫數-可表示成兩個質數之和的數。

    所以,題目就可以用文字檔輸入一些大於4的偶數,輸出文字檔就是這些數分解成適合的兩個質數。
    試試吧。

    回覆刪除
  2. Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do
    Input #1, h, u, d, f
    If h = 0 Then Exit Do
    n = 1: k = 0
    For i = 1 To 999
    k = k + u
    u = u * (1 - f / 100)
    If k >= h Then
    ans = True
    Exit For
    End If
    k = k - d
    If k <= 0 Then
    ans = False
    Exit For
    End If
    Next i
    If ans Then
    Print #2, "success on day "; i
    Else
    Print #2, "fail on day "; i
    End If
    Loop
    Close #1
    Close #2
    End Sub

    回覆刪除
  3. 阿瑋好,
    (我幾乎以為你會先解哥德巴赫數呢!)
    這題的程式ok,但是,....那個怪怪的N要做啥?

    回覆刪除
  4. Dim q As String
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do
    ans = 0
    Input #1, h, u, d, f
    If h = 0 Then Exit Sub
    i = 0
    Do Until ans >= h
    i = i + 1
    ans = ans + u
    If ans > h Then Print #2, "success ";: Exit Do
    ans = ans - d
    u = u * (1 - (f / 100))
    If ans < 1 Then Print #2, "fail ";: Exit Do

    Loop
    Print #2, "on day ";
    Print #2, i
    Loop

    Close #2
    Close #1
    End Sub

    回覆刪除
  5. Dim Snail As Integer, H As Integer, U As Integer, D As Integer
    Private Sub Form_Load()
    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2
    Do
    Input #1, H, U, D, F
    Snail = 0
    If H = 0 Then Exit Do
    If H < 6 Or H > 100 Or U < 0 Or U > 100 Or D < 0 Or D > 99 Or F > 99 Or F < 0 Then
    Print "輸入錯誤"
    End If
    downD = U * F / 100
    SnDay = 0
    Do
    Snail = Snail + U - downD * SnDay
    SnDay = SnDay + 1
    If Snail >= H Then
    Print #2, "success on day " & SnDay
    Exit Do
    End If
    Snail = Snail - D
    If Snail <= 0 Then
    Print #2, "fail on day " & SnDay
    Exit Do
    End If
    Loop
    Loop
    Close #2
    Close #1
    End Sub

    回覆刪除