f712 - 撲克排序-1
題目描述
題目要求模擬發牌並對每個玩家的牌進行排序。總共有 52 張牌,發給 10 個玩家,每人 5 張。排序規則是先比較點數大小,點數相同則比較花色大小。花色和點數的大小關係已在題目中明確定義。
解題思路
程式首先讀取輸入的 50 張牌的 ID,並將其分配給 10 個玩家,每人 5 張。然後,對每個玩家的牌進行排序,排序的依據是點數和花色。最後,按照玩家的編號輸出每個玩家的牌。
程式使用一個 card 結構體來表示一張牌,包含點數和花色。使用一個 pc 結構體來表示一個玩家的牌,包含 5 張牌和玩家的 ID。
排序使用 std::sort 函數,並定義了兩個比較函數 cmp 和 cmp2。cmp 函數用於比較兩張牌的大小,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";
}
}
}