2011年7月20日 星期三

奇怪的老闆

內容 : 正體->简体
有一個很古怪的老闆,他有N名員工,每個人有自己的薪水,這個老闆很喜歡去找出編號第A到編號到B之間的最高薪水與最低薪水的差,但是你以為他只找一次嗎?當然不是,他有強迫症,他每隔1秒就隨機寫兩個數字,然後找出這段數字裡最多薪水的錢,並寫下來作成紀錄。

老闆每次都要他的秘書幫他找,他的秘書受不了,想請你幫她寫一個程式讓他可以很迅速的找到,在這區間最高薪水與最低薪水的差是多少錢, 好讓他可以輕鬆一下。

輸入說明 :
第一行有兩個數字N(1 ≤ N ≤ 50,000), Q (1 ≤ Q ≤ 200,000) 代表有N名員工跟Q個問題。

接下來有 N行代表第1~N名的員工薪水。

在接下來的Q行有兩個數字 a,b
"(0 < a < = b < = n)" 代表老闆寫的兩個數字,請你找出這段區間的最高薪水與最低薪水的差。

輸出說明 :
對於每一個問題,印出最高薪水與最低薪水的差為何?並換行。
範例輸入 :

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

6
3
0

6 則留言:

  1. list2用來放最大值
    list3用來放最小值

    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, Q
    List1.AddItem "占位子"
    For i = 1 To N
    Input #1, M
    List1.AddItem M
    Next i

    For i = 1 To Q
    Input #1, S, E
    List2.Clear: List3.Clear
    List2.AddItem 0: List3.AddItem 50000
    For J = S To E
    If Val(List1.List(J)) > Val(List2.List(0)) Then Call M_sub(List1.List(J))
    If Val(List1.List(J)) < Val(List3.List(0)) Then Call L_sub(List1.List(J))
    Next J
    Print #2, Val(List2.List(0)) - Val(List3.List(0))
    Next i
    Close #2
    Close #1
    End
    End Sub

    Sub M_sub(A)
    If Val(A) > Val(List2.List(0)) Then
    List2.Clear
    List2.AddItem A
    End If
    End Sub

    Sub L_sub(A)
    If Val(A) < Val(List3.List(0)) Then
    List3.Clear
    List3.AddItem A
    End If
    End Sub

    回覆刪除
  2. 佑好,
    程式正確。
    但是,取最大值和最小值那邊,你用了副程式,怪怪的。
    你不但用了副程式,還加上二個listbox,都是沒必要的。
    還有,你假設了最大和最小,這點是危險的,有可能那個假設的值,成了答案,那就是出錯了。
    -->
    簡單用兩個變數,max和min都設成範圍內的第1個數。
    然後從第2個數(如果有的話),去和max和min去比,就是了。

    回覆刪除
  3. 熊掌好,

    所以從
    1
    7
    3
    4
    2
    5
    挑一個去比較就可以了?

    回覆刪除
  4. 佑好,
    不是隨便一個,是拿範圍內的「第一個」,去和「其它個」比大、比小。

    回覆刪除
  5. 熊掌好,

    所以這一題是要
    List2.AddItem list1.list(1)
    List3.AddItem list1.list(1)

    也就是1來去跟其他比較摟

    懂了,
    謝老師

    回覆刪除
  6. Dim N&, Q&, F&, L&, Ma, Mi


    Private Sub Form_Load()
    Me.Hide
    List1.AddItem "補第0格"

    Open App.Path & "\in.txt" For Input As #1
    Open App.Path & "\out.txt" For Output As #2

    Input #1, N, Q

    For i = 1 To N
    Input #1, a: Do While Len(a) < 9: a = "0" & a: Loop: List1.AddItem a
    Next

    For i = 1 To Q
    List2.Clear
    Input #1, F, L
    For x = F To L
    List2.AddItem List1.List(x)
    Next

    Ma = Max()
    Mi = Min()

    Print #2, Ma - Mi

    Next

    Close
    Close
    End
    End Sub
    Function Max()

    Max = Val(List2.List(List2.ListCount - 1))
    End Function

    Function Min()
    Min = Val(List2.List(0))
    End Function


    感覺這題寫得很清晰

    回覆刪除