week9 B-东东学打牌

题面

最近,东东沉迷于打牌。所以他找到 HRZ、ZJM 等人和他一起打牌。由于人数众多,东东稍微修改了亿下游戏规则:

  • 所有扑克牌只按数字来算大小,忽略花色。
  • 每张扑克牌的大小由一个值表示。A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K 分别指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。
  • 每个玩家抽得 5 张扑克牌,组成一手牌!(每种扑克牌的张数是无限的,你不用担心,东东家里有无数副扑克牌)。

理所当然地,一手牌是有不同类型,并且有大小之分的。

举个栗子,现在东东的 “一手牌”(记为 α),瑞神的 “一手牌”(记为 β),要么 α > β,要么 α < β,要么 α = β。

那么这两个 “一手牌”,如何进行比较大小呢?首先对于不同类型的一手牌,其值的大小即下面的标号;对于同类型的一手牌,根据组成这手牌的 5 张牌不同,其值不同。下面依次列举了这手牌的形成规则:

  1. 大牌:这手牌不符合下面任一个形成规则。如果 α 和 β 都是大牌,那么定义它们的大小为组成这手牌的 5 张牌的大小总和。
  • 对子:5 张牌中有 2 张牌的值相等。如果 α 和 β 都是对子,比较这个 “对子” 的大小,如果 α 和 β 的 "对子"大小相等,那么比较剩下 3 张牌的总和。
  1. 两对:5 张牌中有两个不同的对子。如果 α 和 β都是两对,先比较双方较大的那个对子,如果相等,再比较双方较小的那个对子,如果还相等,只能比较 5 张牌中的最后那张牌组不成对子的牌。
  2. 三个:5 张牌中有 3 张牌的值相等。如果 α 和 β 都是 “三个”,比较这个 “三个” 的大小,如果 α 和 β 的 "三个"大小相等,那么比较剩下 2 张牌的总和。
  3. 三带二:5 张牌中有 3 张牌的值相等,另外 2 张牌值也相等。如果 α 和 β 都是 “三带二”,先比较它们的 "三个"的大小,如果相等,再比较 “对子” 的大小。
  4. 炸弹:5 张牌中有 4 张牌的值相等。如果 α 和 β 都是 “炸弹”,比较 “炸弹” 的大小,如果相等,比较剩下那张牌的大小。
  5. 顺子:5 张牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 “顺子”,直接比较两个顺子的最大值。
  6. 龙顺:5 张牌分别为 10、J、Q、K、A。

作为一个称职的魔法师,东东得知了全场人手里 5 张牌的情况。他现在要输出一个排行榜。排行榜按照选手们的 “一手牌” 大小进行排序,如果两个选手的牌相等,那么人名字典序小的排在前面。
不料,此时一束宇宙射线扫过,为了躲避宇宙射线,东东慌乱中清空了他脑中的 Cache。请你告诉东东,全场人的排名

输入

输入包含多组数据。每组输入开头一个整数 n (1 <= n <= 1e5),表明全场共多少人。
随后是 n 行,每行一个字符串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是对应人的名字,s2 是他手里的牌情况。

输出

对于每组测试数据,输出 n 行,即这次全场人的排名。

样例输入

3
DongDong AAA109
ZJM 678910
Hrz 678910

样例输出

Hrz
ZJM
DongDong

思路

本题中的思路比较简单,主要是实现过程。
首先创建card结构体来表示每个人及手中的牌:
   a表示人名,b表示牌,x表示当前牌所处的类型,y,z,q 分别表示相同牌型比较时所需要比较的牌,按重要程度降低排序(x>y>q)
在数据输入完成之后,首先将牌转换为1-13中的数。然后,将牌进行排序。按照牌型从大到小进行匹配,如匹配到某一类型,则直接将牌型以及所需要计较的牌赋值后直接continue,处理下一个人的牌。之后再将所有人进行排序,最后进行输出。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 1e5 + 100;
struct card
{
    string a, b;
    int x, y, z, q;
    card()
    {
        a = "";
        b = "";
        x = y = z = q = 0;
    }
}c[maxn];
map<char, int> ma;
bool cmp(card a, card b)
{
    if (a.x != b.x)
        return a.x > b.x;
    if (a.y != b.y)
        return a.y > b.y;
    if (a.z != b.z)
        return a.z > b.z;
    if (a.q != b.q)
        return a.q > b.q;
    return a.a < b.a;
}
int main()
{
    for (int i = 2; i < 10; i++)
    {
        char t[10];
        sprintf(t, "%d", i);
        ma[t[0]] = i;
    }
    ma['J'] = 11;
    ma['Q'] = 12;
    ma['K'] = 13;
    ma['A'] = 1;
    int n;
    while (cin>>n)
    {
        for (int i = 0; i < n; i++)
            cin >> c[i].a >> c[i].b;
        for (int j = 0; j < n; j++)
        {
            int tmp[6];
            for (int i = 0; i < 6; i++)
                tmp[i] = 0;
            int count = 0;
            for (int i = 0; i < 5; i++)
            {
                if (c[j].b[count] == '1')//此牌为10
                {
                    count += 2;
                    tmp[i] = 10;
                }
                else
                {
                    tmp[i] = ma[c[j].b[count]];
                    count++;
                }
            }
            sort(tmp, tmp + 5);
            //龙顺
            if (tmp[0]==1&&tmp[1] == 10 && tmp[2] == 11 && tmp[3] == 12 && tmp[4] == 13)
            {
                c[j].x = 8;
                c[j].y = c[j].z = c[j].q = 0;
                continue;
            }

            //顺子
            if (tmp[1]==tmp[0]+1&&tmp[2]==tmp[1]+1&&tmp[3]==tmp[2]+1&&tmp[4]==tmp[3]+1)
            {
                c[j].x = 7;
                c[j].y = tmp[4];
                c[j].z = c[j].q = 0;
                continue;
            }

            //炸弹
            if (tmp[0] == tmp[1] && tmp[1] == tmp[2] && tmp[2] == tmp[3])
            {
                c[j].x = 6;
                c[j].y = tmp[0];
                c[j].z = tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[4] == tmp[1] && tmp[1] == tmp[2] && tmp[2] == tmp[3])
            {
                c[j].x = 6;
                c[j].y = tmp[1];
                c[j].z = tmp[0];
                c[j].q = 0;
                continue;
            }
            //三带二
            if (tmp[0] == tmp[1] && tmp[1] == tmp[2] && tmp[4] == tmp[3])
            {
                c[j].x = 5;
                c[j].y = tmp[0];
                c[j].z = tmp[4];
                c[j].q = 0;
                continue;
            }
            if ((tmp[0] == tmp[1] && tmp[2] == tmp[3] && tmp[3] == tmp[4]))
            {
                c[j].x = 5;
                c[j].y = tmp[2];
                c[j].z = tmp[0];
                c[j].q = 0;
                continue;
            }
            //三个
            if (tmp[1] == tmp[0] && tmp[1] == tmp[2])
            {
                c[j].x = 4;
                c[j].y = tmp[0];
                c[j].z = tmp[3] + tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[1] == tmp[2] && tmp[2] == tmp[3])
            {
                c[j].x = 4;
                c[j].y = tmp[1];
                c[j].z = tmp[0] + tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[2] == tmp[3] && tmp[3] == tmp[4])
            {
                c[j].x = 4;
                c[j].y = tmp[2];
                c[j].z = tmp[0] + tmp[1];
                c[j].q = 0;
                continue;
            }
            //两对
            if (tmp[0] == tmp[1] && tmp[2] == tmp[3])
            {
                c[j].x = 3;
                c[j].y = tmp[2];
                c[j].z = tmp[0];
                c[j].q = tmp[4];
                continue;
            }
            if (tmp[0] == tmp[1] && tmp[3] == tmp[4])
            {
                c[j].x = 3;
                c[j].y = tmp[3];
                c[j].z = tmp[0];
                c[j].q = tmp[2];
                continue;
            }
            if (tmp[1] == tmp[2] && tmp[3] == tmp[4])
            {
                c[j].x = 3;
                c[j].y = tmp[3];
                c[j].z = tmp[1];
                c[j].q = tmp[0];
                continue;
            }
            //一对
            if (tmp[0] == tmp[1])
            {
                c[j].x = 2;
                c[j].y = tmp[0];
                c[j].z = tmp[2] + tmp[3] + tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[1] == tmp[2])
            {
                c[j].x = 2;
                c[j].y = tmp[2];
                c[j].z = tmp[0] + tmp[3] + tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[2] == tmp[3])
            {
                c[j].x = 2;
                c[j].y = tmp[2];
                c[j].z = tmp[0] + tmp[1] + tmp[4];
                c[j].q = 0;
                continue;
            }
            if (tmp[3] == tmp[4])
            {
                c[j].x = 2;
                c[j].y = tmp[3];
                c[j].z = tmp[0] + tmp[1] + tmp[2];
                c[j].q = 0;
                continue;
            }
            //大牌
            c[j].x = 1;
            c[j].y = tmp[0] + tmp[1] + tmp[2] + tmp[3] + tmp[4];
            c[j].z = c[j].q = 0;
        }
        sort(c, c + n, cmp);
        for (int i = 0; i < n; i++)
            cout << c[i].a << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!对于心脏病预测的问题,使用循环神经网络(RNN)是一种常见的方法。RNN适用于处理序列数据,而心电图信号就是一种序列数据。在使用RNN进行心脏病预测时,你可以将心电图信号作为输入序列,然后通过训练RNN模型来预测患者是否患有心脏病。 首先,你需要准备一个合适的数据集,其中包含心电图信号和相应的心脏病标签。可以使用公开的心电图数据集,如PTB数据库或MIT-BIH数据库。然后,你可以对数据进行预处理和特征工程,如数据清洗、滤波、降采样等。 接下来,你可以构建一个RNN模型。RNN模型由一系列循环层组成,每个循环层都会处理一个时间步的输入数据。你可以选择不同类型的RNN单元,如简单循环单元(SimpleRNN)、长短期记忆网络(LSTM)或门控循环单元(GRU)。通过添加适当的全连接层和激活函数,你可以将RNN模型输出映射到二分类问题(有或无心脏病)的结果。 然后,你可以使用训练集对RNN模型进行训练,并使用验证集进行模型调优。在训练过程中,你可以使用适当的损失函数(如交叉熵)和优化算法(如随机梯度下降)来最小化模型的预测误差。 最后,你可以使用测试集对训练好的模型进行评估,并计算模型的性能指标,如准确率、精确率、召回率等。这些指标可以帮助你评估模型的预测能力和泛化能力。 需要注意的是,心脏病预测是一个复杂的医问题,仅仅使用心电图信号可能不能得到准确的预测结果。通常情况下,还需要结合其他患者的临床信息和医知识来进行综合评估。因此,在进行心脏病预测时,建议与专业医生合作,并遵循相关的医准则和规范。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值