Time Limit: 3000MS     64bit IO Format: %lld & %llu

Description

In 5-card draw poker, a player is dealt a hand of five cards (which may be looked at). The player may then discard between zero and five of his or her cards and have them replaced by the same number of cards from the top of the deck (which is face down). The object is to maximize the value of the final hand. The different values of hands in poker are given at the end of this problem.

Normally the player cannot see the cards in the deck and so must use probability to decide which cards to discard. In this problem, we imagine that the poker player is psychic and knows which cards are on top of the deck. Write a program which advises the player which cards to discard so as to maximize the value of the resulting hand.

Input and Output

Input will consist of a series of lines, each containing the initial five cards in the hand then the first five cards on top of the deck. Each card is represented as a two-character code. The first character is the face-value (A=Ace, 2-9, T=10, J=Jack, Q=Queen, K=King) and the second character is the suit (C=Clubs, D=Diamonds, H=Hearts, S=Spades). Cards will be separated by single spaces. Each input line will be from a single valid deck, that is there will be no duplicate cards in each hand and deck.

Each line of input should produce one line of output, consisting of the initial hand, the top five cards on the deck, and the best value of hand that is possible. Input is terminated by end of file.

Use the sample input and output as a guide. Note that the order of the cards in the player's hand is irrelevant, but the order of the cards in the deck is important because the discarded cards must be replaced from the top of the deck. Also note that examples of all types of hands appear in the sample output, with the hands shown in decreasing order of value.

Sample Input

TH JH QC QD QS QH KH AH 2S 6S
2H 2S 3H 3S 3C 2D 3D 6C 9C TH
2H 2S 3H 3S 3C 2D 9C 3D 6C TH
2H AD 5H AC 7H AH 6H 9H 4H 3C
AC 2D 9C 3S KD 5S 4D KS AS 4C
KS AH 2H 3C 4H KC 2C TC 2D AS
AH 2C 9S AD 3C QH KS JS JD KD
6C 9C 8C 2D 7C 2H TC 4C 9S AH
3D 5S 2H QD TD 6S KH 9H AD QH

Sample Output

Hand: TH JH QC QD QS Deck: QH KH AH 2S 6S Best hand: straight-flush
Hand: 2H 2S 3H 3S 3C Deck: 2D 3D 6C 9C TH Best hand: four-of-a-kind
Hand: 2H 2S 3H 3S 3C Deck: 2D 9C 3D 6C TH Best hand: full-house
Hand: 2H AD 5H AC 7H Deck: AH 6H 9H 4H 3C Best hand: flush
Hand: AC 2D 9C 3S KD Deck: 5S 4D KS AS 4C Best hand: straight
Hand: KS AH 2H 3C 4H Deck: KC 2C TC 2D AS Best hand: three-of-a-kind
Hand: AH 2C 9S AD 3C Deck: QH KS JS JD KD Best hand: two-pairs
Hand: 6C 9C 8C 2D 7C Deck: 2H TC 4C 9S AH Best hand: one-pair
Hand: 3D 5S 2H QD TD Deck: 6S KH 9H AD QH Best hand: highest-card
6736778 Accepted 0 0 2923
2016-08-04 09:33:04

题目大意如下:这是一几局德州扑克游戏。给定5张初始手牌和5张牌的牌堆(可预知牌堆中的牌类、数字、花色以及顺序,即玩家具有超能力),可以拿手牌换牌堆最上方的牌,之后手牌丢弃,换到的牌不允许再换。

思路如下:先确定枚举和搜索的对象,本题的对象应该是要弃的手牌,由于考虑到换牌的数量和制定牌不定,我们要用到子集枚举的算法。而这里我们用增量法。

用string类配合cin(string是类,不能用scanf或printf,所以果断用cin和cout)之后,预处理牌的点数,将2~9和A、T、J、Q、K统一转化为数字。之后,用增量法枚举要换的牌,之后使用judge函数对它的花色和点数进行判断,这里要外加一个sort优化方便直接用if语句判断,记录最高分手牌则用一个常数数组记录同花顺~大牌的降序字符串数组,用数组的下标值来比较,记录最小值ans,最后按题目要求输出。

代码如下:(2KB)

#include<string>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
string cd[11];
string bthd[]={"straight-flush","four-of-a-kind","full-house","flush","straight","three-of-a-kind","two-pairs","one-pair","highest-card"};
int val[11],a[11],hd[6],ans;
int jud(int cur)
{
bool samecol=1;
for(int i=0;i<cur;i++){
hd[i]=val[a[i]];
if(cd[a[0]][1]!=cd[a[i]][1])samecol=0;
}
for(int i=cur;i<5;i++){
hd[i]=val[5+i-cur];
if(cd[a[0]][1]!=cd[5+i-cur][1])samecol=0;
}
sort(hd,hd+5);
bool flush=1;
for(int i=0;i<4;i++)
if((i||hd[0]!=1||hd[4]!=13)&&hd[i]+1!=hd[i+1])
{flush=0;break;}
if(samecol&&flush)return 0;
if((hd[0]==hd[1]||hd[3]==hd[4])&&hd[1]==hd[2]&&hd[2]==hd[3])return 1;
if((hd[0]==hd[1]&&hd[1]==hd[2]&&hd[3]==hd[4])||(hd[0]==hd[1]&&hd[2]==hd[3]&&hd[3]==hd[4]))return 2;
if(samecol)return 3;
if(flush)return 4;
if((hd[0]==hd[1]&&hd[1]==hd[2])||(hd[1]==hd[2]&&hd[2]==hd[3])||(hd[2]==hd[3]&&hd[3]==hd[4]))return 5;
if(((hd[0]==hd[1])&&(hd[2]==hd[3]||hd[3]==hd[4]))||(hd[1]==hd[2]&&hd[3]==hd[4]))return 6;
if(hd[0]==hd[1]||hd[1]==hd[2]||hd[2]==hd[3]||hd[3]==hd[4])return 7;
return 8;
}
void sub(int cur)
{
ans=min(ans,jud(cur));
int s=cur?a[cur-1]+1:0;
for(int i=s;i<5;i++){
a[cur]=i;
sub(cur+1);
}
}
void solve()
{
for(int i=0;i<10;i++){
if(cd[i][0]=='T')val[i]=10;
else if(cd[i][0]=='J')val[i]=11;
else if(cd[i][0]=='Q')val[i]=12;
else if(cd[i][0]=='K')val[i]=13;
else if(cd[i][0]=='A')val[i]=1;
else val[i]=cd[i][0]-'0';
}
ans=8;
sub(0);
}
void out()
{
cout<<"Hand: ";
for(int i=0;i<5;i++)
cout<<cd[i]<<" ";
cout<<"Deck: ";
for(int i=5;i<10;i++)
cout<<cd[i]<<" ";
cout<<"Best hand: "<<bthd[ans]<<endl;
}
int main()
{
while(cin>>cd[0]){
for(int i=1;i<10;i++)
cin>>cd[i];
solve();
out();
}
return 0;
}

uva131 The Psychic Poker Player的更多相关文章

  1. UVa 131 - The Psychic Poker Player

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

  2. 备战NOIP每周写题记录(一)···不间断更新

    ※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...

  3. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  4. iOS Storyboard全解析

    来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果, ...

  5. iOS Storyboard 的基本用法

    (Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图:  现 在,你就可以清楚的看 ...

  6. Java-->发牌流程修改版

    --> 这一次要封装得狠一点... package com.xm.ddz; // 每一张牌的属性 public class Card { private String flowerColor; ...

  7. [IOS] Storyboard全解析-第一部分

    (Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这 ...

  8. 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定

    最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...

  9. java练习:质数,匿名内部类创建接口,抽象类派生子类,画圆,字节截取字符串,数字变钱币,五子棋,梭哈

    java学习-质数的孤独 正在看质数的孤独,,,于是写了一个练习代码,输出1-100之间的质数 代码比较烂.待完善吧. 这里用到了continue和break,continue指结束当前轮次循环,跳入 ...

随机推荐

  1. SharePoint 开启网站匿名访问图文详解

    SharePoint 开启网站匿名,需要先开启web application的匿名访问,然后开启site的匿名访问.特别的,site可以选择整个网站开启或者列表和库开启匿名,如果选择列表和库开启匿名, ...

  2. 阿里云上部署 centos+nodejs+mongodb

    先执行 yum -y update nginx 安装 yum -y install nginx 设置开机启动 chkconfig nginx on nodejs 安装: yum install nod ...

  3. IOS开发--微信支付

    前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码.包你也学会了微信支付.而且支付也是面试常问的内容. 正文: 1.首先在开始使用微信支付之前,有一些东西是开发者必须要 ...

  4. Android ANR产生的原理和如何避免

    在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框.用户可以选择 ...

  5. xcode 7及以上版本网络请求不成功的原因

    在Xcode 7以前的版本使用的是http协议,从Xcode 7开始,默认使用的是https协议,这优化了加密性能. 要想在Xcode 7及以上版本能够进行网络请求,我们需要在info.plist文件 ...

  6. 【读书笔记】iOS-ARC-循环引用-解决办法

    一,循环引用最常见的代码类型. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading ...

  7. iOS-工作经验+资料分享(长期更新)

    在此记录工作中的一些经验和技术资料 长期更新 欢迎各位业内朋友指正.交流技术上的问题 0.苹果开发联盟电话 4006 701855 1.轻易不用使用tableViewController,因为改变他自 ...

  8. Hierarchyid 常用操作

        ---------内置函数------------ select hierarchyid::GetRoot()--0x select hierarchyid::Parse('/1/1/') - ...

  9. QBus 关注并推送实时公交信息

                                            后台服务器定时根据关注列表,查询最近车辆,发送邮件进行推送                

  10. 史上最详细“截图”搭建Hexo博客——For Windows

    http://angelen.me/2015/01/23/2015-01-23-%E5%8F%B2%E4%B8%8A%E6%9C%80%E8%AF%A6%E7%BB%86%E2%80%9C%E6%88 ...