(hdu step 6.3.5)Card Game Cheater(匹配的最大数:a与b打牌,问b赢a多少次)
称号:
Card Game Cheater |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) |
Total Submission(s): 103 Accepted Submission(s): 74 |
Problem Description
Adam and Eve play a card game using a regular deck of 52 cards. The rules are simple. The players sit on opposite sides of a table, facing each other. Each player gets k cards from the deck and, after looking at them, places the cards face down in a row on the table. Adam’s cards are numbered from 1 to k from his left, and Eve’s cards are numbered 1 to k from her right (so Eve’s i:th card is opposite Adam’s i:th card). The cards are turned face up, and points are awarded as follows (for each i ∈ {1, . . . , k}):
If Adam’s i:th card beats Eve’s i:th card, then Adam gets one point. If Eve’s i:th card beats Adam’s i:th card, then Eve gets one point. A card with higher value always beats a card with a lower value: a three beats a two, a four beats a three and a two, etc. An ace beats every card except (possibly) another ace. If the two i:th cards have the same value, then the suit determines who wins: hearts beats all other suits, spades beats all suits except hearts, diamond beats only clubs, and clubs does not beat any suit. For example, the ten of spades beats the ten of diamonds but not the Jack of clubs. This ought to be a game of chance, but lately Eve is winning most of the time, and the reason is that she has started to use marked cards. In other words, she knows which cards Adam has on the table before he turns them face up. Using this information she orders her own cards so that she gets as many points as possible. Your task is to, given Adam’s and Eve’s cards, determine how many points Eve will get if she plays optimally. |
Input
There will be several test cases. The first line of input will contain a single positive integer N giving the number of test cases. After that line follow the test cases.
Each test case starts with a line with a single positive integer k <= 26 which is the number of cards each player gets. The next line describes the k cards Adam has placed on the table, left to right. The next line describes the k cards Eve has (but she has not yet placed them on the table). A card is described by two characters, the first one being its value (2, 3, 4, 5, 6, 7, 8 ,9, T, J, Q, K, or A), and the second one being its suit (C, D, S, or H). Cards are separated by white spaces. So if Adam’s cards are the ten of clubs, the two of hearts, and the Jack of diamonds, that could be described by the line TC 2H JD |
Output
For each test case output a single line with the number of points Eve gets if she picks the optimal way to arrange her cards on the table.
|
Sample Input
3 |
Sample Output
1 |
Source
Northwestern Europe 2004
|
Recommend
8600
|
题目大意:
a和b手上都有n张牌,b的一张牌赢了a的一张牌,b就得一分,问b能得多少分。
例子分析:
输入:
3
1//两个人手中的牌的张数
JD//adams手上的牌
JH//eves手上的牌
2
5D TC
4C 5H
输出:
第二个例子中的输出结果为1.为什么呢。
由于eves手上仅仅有5H比adams手上的5D大。得1分。他手上的4C要比
adams手上的TC要小,不能得分。
题目分析:
二分图,求最大匹配。需要注意的是。
1、这道题中的匹配规则已经不是“a愿不愿意与b匹配”了。而是,仅仅有在b>a的时候才干匹配
2、这道题中b和a都是字符串。
怎样比較大小呢?先比較第1个字符然后,假设第1个字符相等再比較第2个字符。
3、这道题是用的是邻接表求的最大匹配数。
代码例如以下:
/*
* e.cpp
*
* Created on: 2015年3月14日
* Author: Administrator
*/ #include <iostream>
#include <cstdio>
#include <vector>
#include <cstring> using namespace std; const int maxn = 27; vector<int> map[maxn];
bool useif[maxn];
int link[maxn]; int n; /**
* 获取一张牌前缀的索引
*/
int card_pre(char a){
string pre = "23456789TJQKA";
int len = pre.length(); int i;
for(i = 0 ; i < len ; ++i){
if(a == pre.at(i)){
return i;
}
} return 0;
} /**
* 获取一张牌后缀的索引
*/
int card_suf(char a){
string suf = "CDSH";
int len = suf.length();
int i;
for(i = 0 ; i < len ; ++i){
if(a == suf.at(i)){
return i;
}
} return 0;
} /**
* 比較a和b这两张牌哪一张牌比較大
*/
bool isBig(string a,string b){
int aa = card_pre(a[0]);//获取一张牌的前缀
int bb = card_pre(b[0]);//获取一张牌的后缀 if(aa == bb){//假设这两张牌的前缀同样
return card_suf(a[1]) < card_suf(b[1]);//则比較后缀
} //假设这两张牌的前缀已经不同样则直接比較前缀
return aa < bb;
} /**
* 推断一个节点t是否能找到和她匹配的节点
*/
bool can(int t){
int i;
int size = map[t].size();//获取愿意与节点t匹配的结点的数量
for(i = 0 ; i < size ; ++i){//遍历每个愿意和结点t匹配的结点
int index = map[t][i];//获取当前愿意和结点t匹配的节点的索引
if(useif[index] == false){//假设这个节点还没有匹配
useif[index] = true;//那么将这个节点标记为已经匹配
//假设这个节点还没有匹配的节点||月这个节点匹配的节点可以找到其它结点与它匹配
if(link[index] == -1 || can(link[index])){
link[index] = t;//那么将当前节点匹配的结点设置为t return true;//返回true,表示根节点t可以找到与它匹配的节点
}
}
} return false;//返回false,表示节点t无法找到与它匹配的结点
} /**
* 求醉大匹配数
*
*/
int max_match(){
int num = 0; int i;
for(i = 0 ; i < n ; ++i){//遍历每个结点
memset(useif,false,sizeof(useif));
if(can(i) == true){
num++;
}
} return num;
} int main(){
int t;
scanf("%d",&t); string adams[maxn]; while(t--){
// int n;//这里千万不要在定义一个局部变量,否则会覆盖全局变量
scanf("%d",&n);
int i; //初始化变量
memset(link,-1,sizeof(link));
for(i = 0 ; i < n ; ++i){
map[i].clear();
} for(i = 0 ; i < n ; ++i){//初始化adams的牌
cin >> adams[i];
} string eves;
/**
* 每次读入eves当前的牌,都接着计算它能与adams的那些牌匹配.
* 这列的匹配规则已经不是:a愿不愿意 与b匹配了.
* 而是仅仅有当b>a的时候,b才干与a匹配
* (为什么呢?由于eves要得分,那么他手上的牌就必需要比adams的大)
*/
for(i = 0 ; i < n ; ++i){
cin >> eves; int j;
for(j = 0 ; j < n ; ++j){
if(isBig(adams[j],eves) == true){
map[i].push_back(j);
}
}
} printf("%d\n",max_match());//计算最大匹配数
} return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
(hdu step 6.3.5)Card Game Cheater(匹配的最大数:a与b打牌,问b赢a多少次)的更多相关文章
- (简单匹配)Card Game Cheater -- hdu --1528
http://acm.hdu.edu.cn/showproblem.php?pid=1528 Card Game Cheater Time Limit: 2000/1000 MS (Java/Othe ...
- hdu 1528 Card Game Cheater (二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu----(1528)Card Game Cheater(最大匹配/贪心)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Card Game Cheater(贪心+二分匹配)
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- HDOJ 1528 Card Game Cheater
版权声明:来自: 码代码的猿猿的AC之路 http://blog.csdn.net/ck_boss https://blog.csdn.net/u012797220/article/details/3 ...
- Card Game Cheater
Card Game Cheater Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- hdu 1528 Card Game Cheater ( 二分图匹配 )
题目:点击打开链接 题意:两个人纸牌游戏,牌大的人得分.牌大:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < ...
- POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
水题,感觉和田忌赛马差不多 #include<cstdio> #include<cstring> #include<cmath> #include<algor ...
- (hdu step 7.1.5)Maple trees(凸包的最小半径寻找掩护轮)
称号: Maple trees Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
随机推荐
- Java 模拟队列(一般队列、双端队列、优先级队列)
队列: 先进先出,处理类似排队的问题,先排的.先处理,后排的等前面的处理完了,再处理 对于插入和移除操作的时间复杂度都为O(1).从后面插入,从前面移除 双端队列: 即在队列两端都能够insert和r ...
- Laravel 中国 - 巨匠级PHP开发框架 Laravel 中国社区
http://m.baidu.com/from=844b/bd_page_type=1/ssid=0/uid=3151E6C0905477A13653132D762BB6FB/pu=sz%401320 ...
- poj 1198 hdu 1401 搜索+剪枝 Solitaire
写到一半才发现能够用双向搜索4层来写,但已经不愿意改了,干脆暴搜+剪枝水过去算了. 想到一个非常水的剪枝,h函数为 当前点到终点4个点的最短距离加起来除以2.由于最多一步走2格,然后在HDU上T了, ...
- SE 2014年4月17日
描述BGP路由属性 MED.首选值 的特点 MED相当于IGP协议中的度量值,在其他条件相同时,当本自治系统有多条到达外部自治系统的链路时,MED值小的路由优选.MED属性只能在两个自治系统间传递. ...
- three.js是JavaScript编写的WebGL第 三方库
three.js是JavaScript编写的WebGL第 三方库.提供了非常多的3D显示功能.Three.js 是一款运行在浏览器中的 3D 引擎,你可以用它创建各种三维场景,包括了摄影机.光影.材质 ...
- LINUX设备驱动程序的注意事项(两)建设和执行模块
<一>:设置測试系统 首先准备好一个内核源代码树,构造一个新内核,然后安装到自己的系统中. <二>:HelloWorld模块 #inclu ...
- Linux系统时间和硬件时间设置
在Linux中有硬件时钟与系统时钟两种时钟.硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟.系统时钟则是指kernel中的时钟.所有Linux相关指令与函数都是读取系统时钟的设定 ...
- php-GD库的函数(二)
<?php //imagecopy — 拷贝图像的一部分粘贴到某图像上 /*bool imagecopy ( resource $dst_im , resource $src_im , int ...
- 边坡优化主题5——bzoj 1096 [ZJOI2007]仓库建设 解决问题的方法
[原标题] 1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1998 Solved: 816 [id=10 ...
- Android开发工具综述,开发人员必备工具
安卓开发工具汇总.开发者必备.安卓开发过程中须要用到各种工具,作为一名安卓开发者,有木有感到亚历山大,那么多工具! 今天给大家汇总了一下安卓开发工具,安卓开发者必备利器. 1.Draw 9-Patch ...