# Sorting# Struct# Greedy# Array

f712 - 撲克排序-1

🔗 前往 ZeroJudge 原題

題目描述

題目要求模擬發牌並對每個玩家的牌進行排序。總共有 52 張牌,發給 10 個玩家,每人 5 張。排序規則是先比較點數大小,點數相同則比較花色大小。花色和點數的大小關係已在題目中明確定義。

解題思路

程式首先讀取輸入的 50 張牌的 ID,並將其分配給 10 個玩家,每人 5 張。然後,對每個玩家的牌進行排序,排序的依據是點數和花色。最後,按照玩家的編號輸出每個玩家的牌。 程式使用一個 card 結構體來表示一張牌,包含點數和花色。使用一個 pc 結構體來表示一個玩家的牌,包含 5 張牌和玩家的 ID。 排序使用 std::sort 函數,並定義了兩個比較函數 cmpcmp2cmp 函數用於比較兩張牌的大小,cmp2 函數用於比較兩個玩家的牌的大小。

複雜度分析

  • 時間複雜度: O(N log N),其中 N 是牌的數量 (50)。主要時間花費在排序上,std::sort 的時間複雜度為 O(N log N)。
  • 空間複雜度: O(N),主要用於儲存牌的資訊,包括 ans 陣列和 card 結構體。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;
struct card{
	int point,color;
};
struct pc{
	card a[5];
	int id;
};pc ans[11];
int t,trash,ccd;
char mcolor[4]={'S','H','D','C'},mnum[14]={' ','2','3','4','5','6','7','8','9','T','J','Q','K','A'};
bool cmp(card x,card y){
	if(x.point>y.point||(x.point==y.point&&x.color<y.color))
		return 1;
	return 0;
}
bool cmp2(pc x,pc y){
	for(int i=0;i<5;++i){
		if(x.a[i].point>y.a[i].point)
			return 1;
		else if(x.a[i].point<y.a[i].point)
			return 0;
	}
	if(x.a[0].color<y.a[0].color)
		return 1;
	return 0;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> t;
	for(int ca=1;ca<=t;++ca){
		for(int i=0;i<50;++i){
			ans[i%10].id=i+1;
			cin >> ccd;
			ans[i%10].a[i/10].point=ccd%13;
			if(ccd%13==0)
				ans[i%10].a[i/10].point=13;
			ans[i%10].a[i/10].color=ccd/13;
		}
		cin >> trash >> trash; 
		cout << "Case " << ca << ":\n";
		for(int i=0;i<10;++i)
			sort(ans[i].a,ans[i].a+5,cmp);
		sort(ans,ans+10,cmp2);
		for(int i=0;i<10;++i){
			cout << ans[i].id << " ";
			for(int j=0;j<5;++j)
				cout << mcolor[ans[i].a[j].color] << mnum[ans[i].a[j].point] << " ";
			cout << "\n";
		}
	}
}

Discussion