d545 - 2. 抽紙牌(poker)
題目描述
題目要求從一疊撲克牌中找出第 M 大的牌。撲克牌的比較規則是先比較數字大小,數字越大則牌越大。如果數字相同,則比較花色,花色順序為 黑桃(S) > 紅心(H) > 方塊(D) > 梅花(C)。
解題思路
解題思路是將所有牌儲存到一個結構體陣列中,然後使用自定義比較函數對陣列進行排序。排序後,第 M 大的牌就是陣列中索引為 M-1 的元素。題目中輸入的數字代表牌面大小,需要轉換成對應的數字,例如 K 代表 13,Q 代表 12,J 代表 11,A 代表 1。
複雜度分析
- 時間複雜度: O(N log N),主要來自於排序操作。
- 空間複雜度: O(N),主要來自於儲存撲克牌的陣列。
程式碼
#include <iostream>
#include <algorithm>
using namespace std;
struct card{
char color;
int num;
};
bool cmp(card a,card b){
if(a.num==b.num)
return a.color>b.color;
return b.num<a.num;
}
int main(){
int n;
while(cin >> n){
card a[n];
for(int i=0;i<n;i++)
cin >> a[i].color >> a[i].num;
sort(a,a+n,cmp);
cin >> n;
cout << a[n-1].color << " " << a[n-1].num << "\n";
}
}