Files
leetcode-master/problems/kamacoder/0148.扑克牌同花顺.md
programmercarl d1be6070c2 Update
2024-08-01 10:25:20 +08:00

3.7 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;
}

Java代码如下


import java.util.*;

public class Main {
    static String[] cards = {"H", "S", "D", "C"}; // 花色数组

    static class Color {
        Set<Integer> st; // 同一花色牌的集合
        Map<Integer, Long> cnt;  // 同一花色牌对应的数量

        Color() {
            st = new HashSet<>(); // 初始化集合
            cnt = new HashMap<>(); // 初始化映射
        }
    }

    static Map<String, Color> umap = new HashMap<>(); // 用于存储每种花色对应的Color对象

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(); // 读取牌的数量

        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt(); // 读取牌的值
            int y = scanner.nextInt(); // 读取牌的数量
            String card = scanner.next(); // 读取牌的花色

            umap.putIfAbsent(card, new Color()); // 如果不存在该花色则创建一个新的Color对象
            umap.get(card).st.add(x); // 将牌的值加入集合
            umap.get(card).cnt.put(x, umap.get(card).cnt.getOrDefault(x, 0L) + y); // 更新牌的数量
        }

        long sum = 0; // 结果累加器

        // 遍历每一种花色
        for (String cardOne : cards) {
            Color colorOne = umap.getOrDefault(cardOne, new Color()); // 获取对应花色的Color对象

            // 遍历同花色的每一张牌
            for (int number : colorOne.st) {
                long numberCount = colorOne.cnt.get(number); // 获取当前牌的数量

                // 计算从当前牌到number+4的最小数量
                long cal = numberCount;
                for (int j = number + 1; j <= number + 4; j++) {
                    cal = Math.min(cal, colorOne.cnt.getOrDefault(j, 0L)); // 更新cal为最小值
                }

                // 将结果累加到sum
                sum += cal;

                // 将统计过的同花顺数量减去
                for (int j = number + 1; j <= number + 4; j++) {
                    colorOne.cnt.put(j, colorOne.cnt.getOrDefault(j, 0L) - cal);
                }
            }
        }

        System.out.println(sum); // 输出结果
    }
}