CPE 一顆星選集 49 道必考題
題目連結:https://zerojudge.tw/ShowProblem?problemid=e606
內容
給定一個數列,找出一個整數 A 使得到數列上每個點的距離和為最小。
每組測資第一列為數列長度 n (0 < n <= 1000000),接著為數列。
依序輸出
1. 最小的 A。
2. 輸入中有多少個數與 A 有相同性質。
3. 有幾種可能的 A。
範例輸入
2
10
10
4
1
2
2
4
範例輸出
10 2 1
2 2 1
想法
排序後,若此數列長度為奇數,令 L = R = 中位數,若為偶數,令 L 跟 R 分別為中間兩點。
此時 L 為最小的 A , R - L + 1 為 A 的數量。
接著遍歷一次數列即可知道輸入中有多少個數與 A 有相同性質(找數列中介於 L 與 R 之間的數)。
程式碼
    
    
        1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | #include <bits/stdc++.h> #define fastio ios_base::sync_with_stdio(false), cin.tie(nullptr) using namespace std;
  int mp[1000001]; int main(){     fastio;     int n, L, R, A, num;     while(cin >> n){         A = 0;         for(int i = 0; i < n; ++i) cin >> mp[i];         sort(mp, mp + n);         if(n & 1){             L = mp[n >> 1];             R = L;         }         else {             L = mp[(n >> 1) - 1];             R = mp[n >> 1];         }         num = R - L + 1;         for(int i = 0; i < n; ++i){             if(mp[i] > R) break;             if(mp[i] >= L && mp[i] <= R) ++A;         }         cout << L << " " << A << " " << num << "\n";     } }
   |