# Greedy# Array# Simple Math

i069 - 岩石觀察 (Stones)

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個包含 n 個整數的陣列,代表 n 個岩石的重量。目標是調整岩石的重量,使得所有岩石重量的平均值不變,但最大重量岩石與平均值的差值最小化。具體來說,需要找到重量最大的岩石和重量最小的岩石,然後將最大岩石重量減少的差值加到最小岩石重量上。

解題思路

解題思路是首先計算所有岩石重量的平均值。然後找到陣列中最大和最小的岩石重量及其索引。計算最大岩石重量與平均值的差值。最後,從最大岩石重量中減去這個差值,並將差值加到最小岩石重量上。輸出調整後的岩石重量陣列。這個方法利用貪心策略,直接調整最大和最小的岩石重量,以最小化最大岩石重量與平均值的差值。

複雜度分析

  • 時間複雜度: O(n)
  • 空間複雜度: O(1)

程式碼

#include <iostream>
using namespace std;
int a[105],n,s,ma,mat,mi=1001,mit;
int main(){
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> n;
	for(int i=0;i<n;++i){
		cin >> a[i];
		if(a[i]>ma){
			ma=a[i];
			mat=i;
		}
		if(a[i]<mi){
			mi=a[i];
			mit=i;
		}
		s+=a[i];
	}
	s/=n;
	//cout << s << " " << ma << " " << mat << " " << mi << " " << mit << "\n"; 
	ma-=s;
	a[mat]-=ma;
	a[mit]+=ma;
	for(int i=0;i<n;++i){
		cout << a[i] << " ";
	}
}

Discussion