hdu----(1528)Card Game Cheater(最大匹配/贪心)
Card Game Cheater
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1272 Accepted Submission(s): 675
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 1 JD JH 2 5D TC 4C 5H 3 2H 3H 4H 2D 3D 4D
Sample Output
1 1 2
Source
有两人 a军,e军, 然后像我们平时那样抓了一手牌,然后他们将自己的派都扑在桌子上,对应的开牌,比较谁的大...谁大得一分.
问最后e军得到多少分..
等效的转化为最大匹配问题,类似与田忌赛马的问题
1 #include<cstring>
2 #include<cstdio>
3 #define init(a) memset(a,0,sizeof(a));
4 #define maxn 27
5 int n,m;
6 char ad[maxn][3],ev[maxn][3];
7 bool mat[maxn][maxn],vis[maxn];
8 int adm[maxn];
9 void work(char *s){
10 switch(s[0]){
11 case 'T': s[0]='A'; break;
12 case 'J': s[0]='B'; break;
13 case 'Q': s[0]='C'; break;
14 case 'K': s[0]='D'; break;
15 case 'A': s[0]='E'; break;
16 default : break;
17 }
18 switch(s[1])
19 {
20 case 'C': s[1]='A'; break;
21 case 'D': s[1]='B'; break;
22 case 'S': s[1]='C'; break;
23 case 'H': s[1]='D'; break;
24 default : break;
25 }
26 }
27 void input(int a,char ss[][3])
28 {
29 for(int i=1;i<=a;i++){
30 scanf("%s",ss[i]);
31 work(ss[i]);
32 }
33 }
34 int match(int x)
35 {
36 for(int i=1;i<=n;i++)
37 {
38 if(!vis[i]&&mat[x][i]){
39 vis[i]=1;
40 if(adm[i]==0||match(adm[i]))
41 {
42 adm[i]=x;
43 return 1;
44 }
45 }
46 }
47 return 0;
48 }
49 int main(){
50 int test;
51 //freopen("test.in","r",stdin);
52 scanf("%d",&test);
53 while(test--){
54 scanf("%d",&n);
55 input(n,ad);
56 input(n,ev);
57 init(mat);
58 init(adm);
59 //构造一个匹配图
60 for(int i=1;i<=n;i++){ //eve
61 for(int j=1;j<=n;j++){ //admin
62 if(strcmp(ev[i],ad[j])>0)
63 mat[i][j]=1;
64 }
65 }
66 int ans=0;
67 for(int i=1;i<=n;i++){
68 init(vis);
69 ans+=match(i);
70 }
71 printf("%dn",ans);
72 }
73 return 0;
74 }
- Go语言写Web 应用程序
- 小萝莉说Crash(一):Unrecognized selector sent to instance xxxx
- 游戏服务器之多线程发送(上)
- 游戏服务器之多线程发送(中)
- 游戏服务器之多线程发送(下)
- 【团队分享】手机QQ:升级iOS8.3后,发图就崩,为哪般?
- golang 字符串操作实例
- 【团队分享】刀锋铁骑:常见Android Native崩溃及错误原因
- OpenShift企业版安装:单Master集群
- http线程池的设计与实现(c++)
- iOS崩溃堆栈符号化,定位问题分分钟搞定!
- Duang~ Android堆栈慘遭毁容?精神哥揭露毁容真相!
- Java学习笔记第一篇:坦克大战游戏
- 腾讯Bugly Unity3D Plugin使用指南
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 利用递归函数的返回值
- Android DataBinding的官方双向绑定示例
- 整数拆分
- Android Drawerlayout实现侧滑菜单效果
- 分割等和子集
- LeetCode--打家劫舍问题
- Android 中ListView和GridView赋值错位
- 谈谈类加载器
- Android中AlarmManager+Notification实现定时通知提醒功能
- Java垃圾回收相关面试题
- Android中backgroundDimEnabled的作用
- 甲基化相关的习题背景补充
- Android 完全退出的实例详解
- Android 双击Back键退出应用的实现方法
- 2020最全Java面试题--基础篇