e606: 10057 - A mid-summer nights dream

  1. 1. 內容
  2. 2. 範例輸入
  3. 3. 範例輸出
  4. 4. 想法
  5. 5. 程式碼

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 之間的數)。

程式碼

C++
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";
}
}