# Sorting# Array# Greedy

b680 - 百米賽道編排

🔗 前往 ZeroJudge 原題

題目描述

題目要求將 N 位選手(N 為 8 的倍數)按照他們的最佳成績進行分組和賽道編排。分組的規則是將選手分成 N/8 組,並按照成績排序後,以 S 型的方式分配到各組。賽道編排的規則是,在每個組內,成績越好的選手排在中間的賽道,具體順序為 45362718。

解題思路

首先,讀取所有選手的編號和最佳成績,並按照最佳成績升序排序。然後,計算出組數(N/8)。接著,按照 S 型規則將選手分配到各組。最後,按照題目要求的賽道編排順序輸出每個組的選手編號。核心思想是先排序,再按照特定規則分配和輸出。

複雜度分析

  • 時間複雜度: O(n log n),主要來自於對選手的排序。其餘操作,如分配和輸出,的時間複雜度為 O(n)。
  • 空間複雜度: O(n),主要用於儲存選手的資訊和分組後的結果。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
struct p{
	int no;
	float t;
};
bool cmp(p a,p b){
	return a.t<b.t;
}
int n;
int main(){
	while(cin >> n){
		p play[n];
		int en=n/8;
		p ans[8][en];
		for(int i=0;i<n;++i)
			cin >> play[i].no >> play[i].t;
		sort(play,play+n,cmp);
		for(int i=0;i<8;++i)
			for(int j=0;j<en;++j)
				ans[i][j]=play[i*en+j];
		for(int i=0;i<en;++i)
			cout << i+1 << " " << ans[6][i].no << " "  << ans[4][i].no << " " << ans[2][i].no << " " << ans[0][i].no << " " << ans[1][en-i-1].no << " " << ans[3][en-i-1].no << " " << ans[5][en-i-1].no << " " << ans[7][en-i-1].no << "\n";
	}
}

Discussion