2011年7月13日 星期三

最小離差

n個同學(n為偶數),兩人一組,共分成 n/2組。令n/2個同學之體重總和為{S1,S2,……Sn}m為體重總和之平均值m=[(S1,S2,……Sn  )/n],分組的原則為必須使得m|之差距總合為最小。(輸出結果的差距若非為最小,則本題算錯,零分計算。)寫一程式完成此分組工作。

輸入說明:第一列為學生人數n(4n20)
第二列到第n+1列為學生的體重。(30學生的體重150)
輸入範例:假定有10個同學,其體重分別為:82537484454657674347。實際輸入之檔案內容如下: 
實際輸入:(test4.txt) 
10
82
53
74
84
45
46
57
67
43
47

輸出說明:列印出每組同學之體重總和及個別體重,且必須依體重總和由大而小印出。
輸出範例:上例中的10個同學體重分別為:82537484454657674347。其各組體重總和及個別體重的實際輸出之檔案內容如下:
     實際輸出:(result4.txt)
127 = 43 + 84
127 = 45 + 82
120 = 46 + 74
114 = 47 + 67
 110 = 53 + 57

4 則留言:

  1. Dim KG(20)
    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
    For i = 1 To N
    Input #1, KG(i)
    Next i
    For i = (N - 1) To 1 Step -1
    For j = 1 To i
    If KG(j) > KG(j + 1) Then
    T = KG(j)
    KG(j) = KG(j + 1)
    KG(j + 1) = T
    End If
    Next j
    Next i
    A = N
    For i = 1 To N / 2
    Print #2, KG(i) + KG(A) & "=" & KG(i) & "+" & KG(A)
    A = A - 1
    Next i
    Close #2
    Close #1
    End
    End Sub

    回覆刪除
  2. 佑好,
    程式正確。
    像這樣的題目,說的很複雜,其實就只是排序,所以解題時,要想清楚題目到底在問什麼,要專業一點的說法是,「演算法」。
    繼續加油。

    回覆刪除
  3. 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 s(ti)

    For i = 1 To ti
    Input #1, n
    s(i) = n
    Next

    '---排序
    For j = 1 To UBound(s)
    For i = 1 To UBound(s) - 1
    If s(i) > s(i + 1) Then
    tmp = s(i)
    s(i) = s(i + 1)
    s(i + 1) = tmp
    End If
    Next
    Next
    '---


    Dim F, L
    F = 1: L = UBound(s)
    Do
    Print #2, Val(s(F)) + Val(s(L)) & " = " & s(F) & " + " & s(L)
    F = F + 1
    L = L - 1
    Loop While F <= L



    Close
    Close
    End
    End Sub

    回覆刪除
  4. arro好,
    程式正確。
    (雖然我還是不清楚數學上「最小離差」有沒有不同的意思。)

    回覆刪除