leetcode-master/problems/kamacoder/0148.扑克牌同花顺.md

1.5 KiB
Raw Blame History

首先我们要定义一个结构体,来存放我们的数据

map<花色,{同一花色牌集合,同一花色的牌对应的牌数量}>

再遍历 每一个花色下,每一个牌 的数量

代码如下详细注释:

#include<bits/stdc++.h>
using namespace std;

string cards[] = {"H","S","D","C"};
typedef long long ll;
struct color
{
    set<int> st; // 同一花色 牌的集合
    map<int, ll> cnt;  // 同一花色 牌对应的数量
};
unordered_map<string, color> umap;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int x, y;
        string card;
        cin >> x >> y >> card;
        umap[card].st.insert(x);
        umap[card].cnt[x] += y;
    }
    ll sum = 0;
    // 遍历每一个花色
    for (string cardOne : cards) {
        color colorOne = umap[cardOne];
        // 遍历 同花色 每一个牌
        for (int number : colorOne.st) {
            ll numberCount = colorOne.cnt[number]; // 获取牌为number的数量是 numberCount

            // 统计 number 到 number + 4 都是否有牌用cal 把 number 到number+4 的数量记下来
            ll cal = numberCount;
            for (int j = number + 1; j <= number + 4; j++) cal = min(cal, colorOne.cnt[j]);
            // 统计结果
            sum += cal;
            // 把统计过的同花顺数量减下去
            for (int j = number + 1; j <= number + 4; j++) colorOne.cnt[j] -= cal;
        }
    }
    cout << sum << endl;
}