uva131 The Psychic Poker Player
| 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的更多相关文章
- UVa 131 - The Psychic Poker Player
题目:手里有五张牌,桌上有一堆牌(五张).你能够弃掉手中的k张牌,然后从牌堆中取最上面的k个. 比較规则例如以下:(按优先级排序) 1.straight-flush:同花顺.牌面为T(10) - A, ...
- 备战NOIP每周写题记录(一)···不间断更新
※Recorded By ksq2013 //其实这段时间写的题远远大于这篇博文中的内容,只不过那些数以百记的基础题目实在没必要写在blog上; ※week one 2016.7.18 Monday ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- iOS Storyboard全解析
来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果, ...
- iOS Storyboard 的基本用法
(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现 在,你就可以清楚的看 ...
- Java-->发牌流程修改版
--> 这一次要封装得狠一点... package com.xm.ddz; // 每一张牌的属性 public class Card { private String flowerColor; ...
- [IOS] Storyboard全解析-第一部分
(Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果,我贴上本教程所完成的Storyboard的截图: 现在,你就可以清楚的看到这 ...
- 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定
最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...
- java练习:质数,匿名内部类创建接口,抽象类派生子类,画圆,字节截取字符串,数字变钱币,五子棋,梭哈
java学习-质数的孤独 正在看质数的孤独,,,于是写了一个练习代码,输出1-100之间的质数 代码比较烂.待完善吧. 这里用到了continue和break,continue指结束当前轮次循环,跳入 ...
随机推荐
- sqlite与多线程
数据库支持三种线程模式 Single-thread. In this mode, all mutexes are disabled and SQLite is unsafe to use in mor ...
- 【代码笔记】iOS-书架页面
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- GCD基础知识总结
iOS三种多线程编程技术: 1.NSThread 2.NSOperation 3.GCD(Grand Central Dispatch) 从上到下,抽象度层次从低到高,抽象度越高的使用越简单,也是Ap ...
- 在SQL中使用CLR提供基本函数对二进制数据进行解析与构造
二进制数据包的解析一般是借助C#等语言,在通讯程序中解析后形成字段,再统一单笔或者批量(表类型参数)提交至数据库,在通讯程序中,存在BINARY到struct再到table的转换. 现借助CLR提 ...
- 使用vs2010生成SQL Server 随机数据
前几天做测试数据,偶然发现vs2010中有一个生成随机数据的功能,记录下来,方便以后使用,确实非常的好用灵活快捷. 为了简单扼要的说明,下面我用一个实例来说明如何快捷使用: 在VS2010创建数据库项 ...
- WebApi深入学习--概述+路由查找
如何创建Controller这里就不说了,只写一些可能是高阶知识的内容 关于WebApi的官方介绍及示例 http://www.asp.net/web-api/ 1.跨域 Asp.NET有专门的跨域扩 ...
- 【故障处理】告警日志报“ORA-01565 Unable To open Spfile”
[故障处理]告警日志报"ORA-01565 Unable To open Spfile" 1.1 BLOG文档结构图 1.2 故障分析及解决过程 1.2.1 故障环境介绍 项 ...
- FP并行算法的几个相关方向
1 集群系统中的 FP-tree 并行算法(many for one一个任务 还是 云计算one for many多个任务?) 计算机集群系统利用网络把一组具有高性能的工作站或者 PC 机按一定的结构 ...
- jquery简单入门(一)
相关: 本文参考<锋利的jQuery第二版> 写在前面: jQuery作为javascript框架,是做网页交互工作者,一个值得学习的优秀的前端框架... 百度指数分析:(http://i ...
- c# 注册全局热键
//引入系统API [DllImport("user32.dll")] static extern bool RegisterHotKey(IntPtr hWnd, int id, ...
