# Greedy# Array# Sorting

f443 - 商品擺設 Merchandise

🔗 前往 ZeroJudge 原題

題目描述

題目給定一串商品的擺設順序,其中 -1 代表空位。目標是將商品重新擺設,使得每個 -1 空位兩側的商品數值最大化。具體來說,對於每個空位,找到其左右兩側商品中數值最大和最小的商品,然後交換它們的位置。

解題思路

這題的核心思想是貪心演算法。對於每個空位,我們需要找到其左右兩側的最大值和最小值,並進行交換。這樣可以盡可能地使空位兩側的商品數值更大,從而達到最佳的擺設效果。

程式碼首先讀取商品的初始擺設順序,然後遍歷陣列,找到所有的空位。對於每個空位,程式碼會找到其左右兩側的最大值和最小值,並交換它們的位置。最後,程式碼輸出重新擺設後的商品順序。

複雜度分析

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

程式碼

#include <iostream>
using namespace std;
int a[31][2],n;
int main(){
	cin >> n;
	for(int i=0;i<n;++i)
		cin >> a[i][0];
	for(int i=0;i<n;++i)
		cin >> a[i][1];
	int l=-1,r=-1;
	for(int i=0;i<n;++i){
		if(a[i][0]==-1){
			l=r;
			r=i;
			if(l!=-1&&r!=-1&&r-l>2){
				int ma=-101,mait,mi=101,mit;
				for(int j=l+1;j<r;++j){
					if(a[j][0]>ma){
						ma=a[j][0];
						mait=j;
					}
					if(a[j][0]<mi){
						mi=a[j][0];
						mit=j;
					}
				}
				swap(a[mait][0],a[mit][0]);
				swap(a[mait][1],a[mit][1]);
			}
		}
	}
	for(int i=0;i<n;++i)
		cout << a[i][1] << " ";
}

Discussion