iuxnerijxdeiuxhe 2025-05-25 08:41 采纳率: 40%
浏览 20

德州扑克 时间限制: 2000ms 空间限制: 524288KB 描述

德州扑克
时间限制: 2000ms
空间限制: 524288KB
题目描述
dXqwq 正在参加一场德州扑克比赛!现在,比赛已经进入了最终阶段:nn 位选手都已经押上了全部的筹码,展示手牌开始比较大小。

但选手只要摊牌就可以,可是作为荷官的 orangejuice 要考虑的事情就很多了。她需要你的帮助来计算每位选手的筹码分配,你能帮她吗?

给定每位选手的筹码量 a_ia
i

和牌力相对大小 b_ib
i

,你需要求出每位选手在这手牌结束之后的筹码量 c_ic
i

无论你是否玩过德州扑克,请仔细阅读本题中筹码分配的定义:

统计场上所有筹码量非零的选手的筹码最小值 dd。
将上述所有人每人扣除 dd 的筹码,建立一个边池。
重复这两个操作,直到只有 \le 1≤1 个人的筹码量非零。
对于每个边池,找出所有向该池提供筹码的人中,牌力(并列)最大的。
这些人将会均分这个边池的所有筹码,我们认为筹码可以无限细分。
输入格式
第一行输入一个整数 nn。

第二行输入 nn 个整数 a_ia
i

第三行输入 nn 个整数 b_ib
i

输出格式
输出 nn 行,第 ii 行输出一个浮点数代表 c_ic
i

你的答案会被视为正确,当且仅当对于 i=1,2,\cdots,ni=1,2,⋯,n 都满足 \frac{c_i}{\max(c_i',1)} \le 10^{-6}
max(c
i


,1)
c
i


≤10
−6
,其中 c_i'c
i


是标准答案的值。

样例
Input 1
5
1 2 3 4 5
5 4 3 2 1
Output 1
5
4
3
2
1
Input 2
5
1 3 5 3 1
2 1 1 2 1
Output 2
2.5
0
2
8.5
0
数据范围
本题采用捆绑测试。

Subtask 1(10 pts):n=2n=2。
Subtask 2(15 pts):n=3n=3。
Subtask 3(15 pts):b_ib
i

全部相同。
Subtask 4(15 pts):b_ib
i

互不相同。
Subtask 5(15 pts):a_ia
i

全部相同。
Subtask 6(15 pts):n\le 2\times 10^3n≤2×10
3

Subtask 7(15 pts):无特殊限制。
对于所有数据,2\leq n\leq 10^62≤n≤10
6
,1\leq a_i\leq 10^91≤a
i

≤10
9
,1\leq b_i\leq n1≤b
i

≤n。

样例解释
对于第二个样例,我们会建立 22 个边池:

第一个边池由玩家 1,2,3,4,51,2,3,4,5 提供共 55 枚筹码,玩家 1,41,4 平分底池,每人获得 2.52.5 枚筹码。
第二个边池由玩家 2,3,42,3,4 提供共 66 枚筹码,玩家 44 独占底池并获得 66 枚筹码。
评测规则
1

  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-05-25 08:49
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    德州扑克

    你需要编写一个 C++ 程序来比较德州扑克手牌的大小。下面是一个简单的解决方案:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    // 定义扑克牌的类型
    enum CardType { HEART, DIAMOND, CLUB, SPADE };
    
    // 定义扑克牌的面值
    enum CardValue { ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING };
    
    // 定义扑克牌的结构体
    struct Card {
        CardType type;
        CardValue value;
    };
    
    // 定义扑克手牌的结构体
    struct Hand {
        vector<Card> cards;
        bool isFlush; // 是否是同花
        bool isStraight; // 是否是顺子
    };
    
    // 比较扑克手牌的大小
    bool compareHands(const Hand& hand1, const Hand& hand2) {
        // 如果牌型相同,比较牌的大小
        if (hand1.cards.size() == hand2.cards.size()) {
            // 对于同花,比较牌的大小
            if (hand1.isFlush && hand2.isFlush) {
                for (int i = 0; i < hand1.cards.size(); i++) {
                    if (hand1.cards[i].value > hand2.cards[i].value) {
                        return true;
                    } else if (hand1.cards[i].value < hand2.cards[i].value) {
                        return false;
                    }
                }
                return false;
            }
            // 对于顺子,比较牌的大小
            else if (hand1.isStraight && hand2.isStraight) {
                for (int i = 0; i < hand1.cards.size(); i++) {
                    if (hand1.cards[i].value > hand2.cards[i].value) {
                        return true;
                    } else if (hand1.cards[i].value < hand2.cards[i].value) {
                        return false;
                    }
                }
                return false;
            }
            // 对于其他情况,比较牌的大小
            else {
                for (int i = hand1.cards.size() - 1; i >= 0; i--) {
                    if (hand1.cards[i].value > hand2.cards[hand2.cards.size() - 1 - i].value) {
                        return true;
                    } else if (hand1.cards[i].value < hand2.cards[hand2.cards.size() - 1 - i].value) {
                        return false;
                    }
                }
                return false;
            }
        }
        // 如果牌型不同,比较牌的大小
        else {
            // 对于同花,比较牌的大小
            if (hand1.isFlush && !hand2.isFlush) {
                return true;
            } else if (!hand1.isFlush && hand2.isFlush) {
                return false;
            }
            // 对于顺子,比较牌的大小
            else if (hand1.isStraight && !hand2.isStraight) {
                return true;
            } else if (!hand1.isStraight && hand2.isStraight) {
                return false;
            }
            // 对于其他情况,比较牌的大小
            else {
                if (hand1.cards.size() > hand2.cards.size()) {
                    return true;
                } else if (hand1.cards.size() < hand2.cards.size()) {
                    return false;
                }
                for (int i = hand1.cards.size() - 1; i >= 0; i--) {
                    if (hand1.cards[i].value > hand2.cards[hand2.cards.size() - 1 - i].value) {
                        return true;
                    } else if (hand1.cards[i].value < hand2.cards[hand2.cards.size() - 1 - i].value) {
                        return false;
                    }
                }
                return false;
            }
        }
    }
    
    int main() {
        // 读取扑克手牌
        Hand hand1, hand2;
        // ...
        // 比较扑克手牌的大小
        if (compareHands(hand1, hand2)) {
            cout << "hand1 wins" << endl;
        } else {
            cout << "hand2 wins" << endl;
        }
        return 0;
    }
    

    这个解决方案中,我们首先定义了扑克牌的类型和面值,然后定义了扑克手牌的结构体。然后,我们实现了比较扑克手牌的大小的函数 compareHands。这个函数首先比较牌型,如果牌型相同,比较牌的大小;如果牌型不同,比较牌的大小。最后,我们在 main 函数中读取扑克手牌,然后比较扑克手牌的大小。

    评论

报告相同问题?

问题事件

  • 创建了问题 5月25日