# Sorting# Greedy# Median

e606 - 10057 - A mid-summer nights dream

🔗 前往 ZeroJudge 原題

題目描述

題目要求找出一個整數 A,使得 |X1 - A| + |X2 - A| + ... + |Xn - A| 的值最小,並輸出這個 A 值、最小值出現的次數,以及可能的最小值個數。

解題思路

這個問題可以透過找到數列的中位數來解決。當 n 為奇數時,中位數就是能使上述式子最小化的 A 值。當 n 為偶數時,任何位於兩個中間數之間的 A 值都能使上述式子最小化,因此我們選擇較小的中間數作為 A 值。 程式碼首先讀取輸入的數字 n 和數列中的元素,然後對數列進行排序。接著,根據 n 的奇偶性計算 A 值和最小值出現的次數。對於偶數的情況,還需要計算可能的最小值個數,即兩個中間數之間的範圍大小加 1。

複雜度分析

  • 時間複雜度: O(n log n) (主要來自排序)
  • 空間複雜度: O(n) (用於儲存輸入數列)

程式碼

#include <iostream>
#include <algorithm>
using namespace std; 
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	int n;
	while(cin >> n){
		int a[n];
		for(int i=0;i<n;i++)
			cin >> a[i];
		sort(a,a+n);
		if(n&1){
			int mid=a[n/2],t=0;
			cout << mid << " ";
			for(int i=0;i<n;i++)
				if(a[i]==mid)
					t++;
			cout << t << " 1\n";
		}
		else{
			int mid1=a[n/2],mid2=a[n/2-1],t=0;
			cout << mid2 << " ";
			for(int i=0;i<n;i++)
				if(a[i]==mid1||a[i]==mid2)
					t++;
			cout << t << " " << mid1-mid2+1 << "\n";
		}
	}
}

Discussion