题目:两个人手里各有五张牌,比較两牌型大小。

比較规则例如以下:(按优先级排序,优先级同样按以下内部规则比較)

1.straight-flush:同花顺,牌面连续,花色同样,按最大的值比較。

2.four-of-a-kind:四条,牌面有四个同样的值,按四个的牌面比較;

3.full-house:船牌,牌面有三个同样值,剩下两个也同样值,按三个的牌面比較。

4.flush:同花,五张牌的花色同样,不是顺子。按牌面最大的開始比,同样比較下一个。

5.straight:顺子。五张牌的值连续,按最大的值比較;

6.three-of-a-kind:三条,牌面有三个同样的值,按三个的牌面比較。

7.two-pairs:两对,牌面有两个对子。比較最大的对子,同样比較第二对,同样比較剩下的;

8.one-pair:一对,牌面有一个对子。即两个同值,比对子。同样则按同花比較;

9.highest-card:大牌,没有以上牌型,和同花比較方式同样。

分析:模拟。能够使用条件分支不断推断。只是推断嵌套太多。代码较长。

这里使用一种映射方法,将9种牌型映射到9个互补重叠的单调区间比較;

1.straight-flush:同花顺,区间[13^5+40。13^5+53];

2.four-of-a-kind:四条,区间[13^5+20,13^5+33];

3.full-house:船牌。区间[13^5+1,13^5+14];

4.flush:同花,区间[13^4,13^5]。

5.straight:顺子,区间[-20。-5];

6.three-of-a-kind:三条,区间[-40,-25]。

7.two-pairs:两对。区间[-8000。-2000];

8.one-pair:一对,区间[-13^5*2,-13^4];

9.highest-card:大牌,区间[-13^5*4。13^5*3];

详细操作參照代码(把数据看成是13进制比較好理解)。

说明:UVa131类似物,╮(╯▽╰)╭。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std; int value( char ch )
{
if ( ch == 'T' ) return 8;
if ( ch == 'J' ) return 9;
if ( ch == 'Q' ) return 10;
if ( ch == 'K' ) return 11;
if ( ch == 'A' ) return 12;
return ch - '2';
} int color( char ch )
{
if ( ch == 'S' ) return 0;
if ( ch == 'H' ) return 1;
if ( ch == 'D' ) return 2;
if ( ch == 'C' ) return 3;
} int tests(char cards[][3])
{
//冒泡最终实用武之地了╮(╯▽╰)╭
for (int i = 5; i > 1; -- i)
for (int j = 1; j < i; ++ j)
if (cards[j-1][0] > cards[j][0]) {
swap(cards[j-1][0], cards[j][0]);
swap(cards[j-1][1], cards[j][1]);
} int maps[5][13];
memset(maps, 0, sizeof(maps));
for (int i = 0; i < 5; ++ i) {
maps[color(cards[i][1])][value(cards[i][0])] ++;
maps[4][value(cards[i][0])] ++;
}
//royal-flush | straight-flush
for (int i = 0; i < 4; ++ i)
for (int j = 0; j < 9; ++ j)
if (maps[i][j]&maps[i][j+1]&maps[i][j+2]&maps[i][j+3]&maps[i][j+4])
return 13*13*13*13*13+40+j;
//four-of-a-kind
for (int i = 0; i < 13; ++ i)
if (maps[4][i] >= 4) return 13*13*13*13*13+20+i;
//full-house
int three = 0,two = 0;
for (int i = 12; i >= 0; -- i) {
if (maps[4][i] == 2)
two = two*15+i+1;
if (maps[4][i] == 3)
three = i+1;
}
if (two && three) return 13*13*13*13*13+three+1;
//flush
for (int i = 0; i < 4; ++ i) {
int count = 0, number = 0;
for (int j = 12; j >= 0; -- j)
for (int k = 0; k < maps[i][j]; ++ k) {
++ count;
number = number*13+j;
}
if (count == 5) return number;
}
//straight
for (int i = 0; i < 9; ++ i)
if (maps[4][i]&maps[4][i+1]&maps[4][i+2]&maps[4][i+3]&maps[4][i+4])
return i-20;
//three-of-a-kind
if (three) return three-40; int ans = 0;
for (int i = 12; i >= 0; -- i)
if (maps[4][i] == 1)
ans = ans*13+i;
//two-pairs
if (two >= 15) two*15+ans-8000;
//one-pair
if (two) return two*13*13*13+ans-13*13*13*13*30;
//high-card
return ans-13*13*13*13*50;
} int main()
{
char white[5][3],black[5][3];
while ( ~scanf("%s",black[0]) ) {
for (int i = 1; i < 5; ++ i)
scanf("%s",black[i]);
for (int i = 0; i < 5; ++ i)
scanf("%s",white[i]); int value = tests(black)-tests(white);
if (value < 0)
printf("White wins.\n");
else if (value > 0)
printf("Black wins.\n");
else printf("Tie.\n");
}
return 0;
}

UVa 10315 - Poker Hands的更多相关文章

  1. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  2. ACM训练计划step 1 [非原创]

    (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成 ...

  3. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  4. ACM-ICPC Dhaka Regional 2012 题解

    B: Uva: 12582 - Wedding of Sultan 给定一个字符串(仅由大写字母构成)一个字母表示一个地点,经过这个点或离开这个点都输出这个地点的字母) 问: 每一个地点经过的次数(维 ...

  5. UVA - 12298 Super Poker II NTT

    UVA - 12298 Super Poker II NTT 链接 Vjudge 思路 暴力开个桶,然后统计,不过会T,用ntt或者fft,ntt用个大模数就行了,百度搜索"NTT大模数&q ...

  6. Super Poker II UVA - 12298 FFT_生成函数

    Code: #include<bits/stdc++.h> #define maxn 1000000 #define ll long long #define double long do ...

  7. UVa 131 - The Psychic Poker Player

    题目:手里有五张牌,桌上有一堆牌(五张).你能够弃掉手中的k张牌,然后从牌堆中取最上面的k个. 比較规则例如以下:(按优先级排序) 1.straight-flush:同花顺.牌面为T(10) - A, ...

  8. UVA - 12298 Super Poker II (FFT+母函数)

    题意:有四种花色的牌,每种花色的牌中只能使用数值的约数个数大于2的牌.现在遗失了c张牌.每种花色选一张,求值在区间[a,b]的每个数值的选择方法有多少. 分析:约数个数大于2,即合数.所以先预处理出5 ...

  9. UVA 12298 Super Poker II (FFT)

    #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using ...

随机推荐

  1. SQL远程连接

    一.添加远程连接EXEC sp_addlinkedserver @server = '254', @srvproduct = '',--链接服务器的 OLE DB 数据源的产品名称    @provi ...

  2. Tcl之Read files for synthesis

    The following file is to read all design files into syntehsis tool automatically, like Cadence RTL C ...

  3. How a stack frame works 栈帧的要素与构建步骤

    http://en.citizendium.org/wiki/Stack_frame To use a stack frame, a thread keeps two pointers, often ...

  4. bazel和TensorFlow安装

    bazel安装:https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu 安 ...

  5. mysql导出数据到excel的两种方式

    使用第一种方式如果数据中有换行符的话会自动换行,但使用第二种方式就不会出现这种效果了.两种方式自己选择哈 1:select * from into outfile 'c:/Users/a.xls' t ...

  6. World Cup(The 2016 ACM-ICPC Asia China-Final Contest dfs搜索)

    题目: Here is World Cup again, the top 32 teams come together to fight for the World Champion. The tea ...

  7. Oracle 控制文件(CONTROLFILE)

    一.Oracle 控制文件 为二进制文件,初始化大小由CREATE DATABASE指定,可以使用RMAN备份 记录了当前数据库的结构信息,同时也包含数据文件及日志文件的信息以及相关的状态,归档信息等 ...

  8. Linux之awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  9. linux sar-系统运行状态统计工具

    推荐:更多linux 性能监测与优化 关注:linux命令大全 sar命令是Linux下系统运行状态统计工具,它将指定的操作系统状态计数器显示到标准输出设备.sar工具将对系统当前的状态进行取样,然后 ...

  10. python3中post请求里带list报错

    这个post请求的数据太长,一般data=,json=就够了. 但是今天这个一直报错,用json吧,报缺少参数,用data吧,报多余[. 后来改成data=,并把数据中的[] 用引号括起来," ...