HDU 1528 贪心模拟/二分图

Card Game Cheater

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1822    Accepted Submission(s): 998

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

Northwestern Europe 2004

题意:

甲乙两个人进行扑克比赛,乙已经知道甲每次要出什么牌,问乙最多能赢几局。每次只出一张牌,大小顺序是2,3,4,5,6,7,8,9,10,J,Q,K,A,大小相同的牌红桃>黑桃>方块>梅花。

代码:

 1 //跟以前做过的田忌赛马相似,从最小的开始比较,乙能赢就赢掉;如果一样大就比较最大的最大的能赢就赢掉,不能赢就用最小的输掉对方最大的;如果小就用它输掉对方最大的。
 2 //二分图最大匹配数,分为甲乙两个点集,将乙能赢甲的之间连条线,求最大匹配数。
 3 #include<iostream>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<algorithm>
 7 using namespace std;
 8 int num[120];
 9 struct desk
10 {
11     int x,y;
12 };
13 bool cmp(desk a,desk b)
14 {
15     if(a.x==b.x) return a.y<b.y;
16     return a.x<b.x;
17 }
18 int main()
19 {
20     int t,n;
21     char ch[3];
22     scanf("%d",&t);
23     while(t--)
24     {
25         desk p1[30],p2[30];
26         scanf("%d",&n);
27         for(int i=0;i<n;i++)
28         {
29             scanf("%s",ch);
30             if(ch[0]>=‘1‘&&ch[0]<=‘9‘)
31             p1[i].x=ch[0]-‘0‘+;
32             else switch(ch[0])
33             {
34                 case ‘T‘:p1[i].x=10;break;
35                 case ‘J‘:p1[i].x=11;break;
36                 case ‘Q‘:p1[i].x=12;break;
37                 case ‘K‘:p1[i].x=13;break;
38                 case ‘A‘:p1[i].x=14;break;
39             }
40             switch(ch[1])
41             {
42                 case ‘C‘:p1[i].y=1;break;
43                 case ‘D‘:p1[i].y=2;break;
44                 case ‘S‘:p1[i].y=3;break;
45                 case ‘H‘:p1[i].y=4;break;
46             }
47         }
48         for(int i=0;i<n;i++)
49         {
50             scanf("%s",ch);
51             if(ch[0]>=‘1‘&&ch[0]<=‘9‘)
52             p2[i].x=ch[0]-‘0‘;
53             else switch(ch[0])
54             {
55                 case ‘T‘:p2[i].x=10;break;
56                 case ‘J‘:p2[i].x=11;break;
57                 case ‘Q‘:p2[i].x=12;break;
58                 case ‘K‘:p2[i].x=13;break;
59                 case ‘A‘:p2[i].x=14;break;
60             }
61             switch(ch[1])
62             {
63                 case ‘C‘:p2[i].y=1;break;
64                 case ‘D‘:p2[i].y=2;break;
65                 case ‘S‘:p2[i].y=3;break;
66                 case ‘H‘:p2[i].y=4;break;
67             }
68         }
69         sort(p1,p1+n,cmp);
70         sort(p2,p2+n,cmp);
71         int s1=0,s2=0,e1=n-1,e2=n-1,ans=0;
72         while(s1<=e1)
73         {
74             if((p2[s2].x>p1[s1].x)||((p2[s2].x==p1[s1].x)&&(p2[s2].y>p1[s1].y)))
75             {
76                 s2++;s1++;
77                 ans++;
78             }
79             else if((p2[s2].x==p1[s1].x)&&(p2[s2].y==p1[s1].y))
80             {
81                 if((p2[e2].x>p1[e1].x)||((p2[e2].x==p1[e1].x)&&(p2[e2].y>p1[e1].y)))
82                 {
83                     e2--;e1--;
84                     ans++;
85                 }
86                 else
87                 {
88                     s2++;e1--;
89                 }
90             }
91             else
92             {
93                 s2++;e1--;
94             }
95         }
96         printf("%d\n",ans);
97     }
98     return 0;
99 }
时间: 2024-10-12 12:34:46

HDU 1528 贪心模拟/二分图的相关文章

HDU 1528 (二分图最大匹配 + 最小覆盖, 14.07.17)

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 c

HDU 4903 (模拟+贪心)

Fighting the Landlords Problem Description Fighting the Landlords is a card game which has been a heat for years in China. The game goes with the 54 poker cards for 3 players, where the “Landlord” has 20 cards and the other two (the “Farmers”) have 1

hdu 4915 Parenthese sequence (贪心+模拟)

题目大意: 一个序列中有左括号和右括号,还有问号,问号可以任意转换成左右括号. 问这个序列有多少种情况的转变使得这个序列变成合法的括号匹配序列. 思路分析: 首先我们分析一下,如何使得一个序列是合法的括号匹配序列. 我们很容易想到的是用栈模拟匹配过程. 当遇到左括号就进栈,当遇到右括号就让栈顶的左括号出栈. 那么在模拟的过程中,造成这个序列的不合法的原因只有当右括号来的时候,此时的栈已经为空. 这里补充一句,一旦一个序列给定,那么这里面的问号有多少变成左括号,多少变成右括号,是一定的. 看完以上

hdu 4105 贪心思想

淋漓尽致的贪心思想 波谷一定是一位数,波峰一位数不够大的时候添加到两位数就一定够大了的. 当在寻找波谷碰到零了就自然当成波谷. 当在寻找波峰时碰到零时,将前面的波谷加到前一个波峰上,让当前的零做波谷,使得波谷的值尽量小,这就是本题最关键的贪心思想,一直想不到. 代码中:a表示前一个值,b表示当前考虑的值,tag为偶数时表示正在寻找波谷,奇数时在寻找波峰. #include<iostream> #include<cstdio> #include<cstring> #inc

[贪心+模拟] zoj 3829 Known Notation

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5383 Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science.

hdu 4964 Emmet(模拟)

题目链接:hdu 4964 Emmet 题目大意: 给定语句,按照语法翻译并输出. 解题思路:用递归模拟文法分析,主要注意几点: 括号并且的情况:(fuck)(you) 括号嵌套的情况:((fuck.you)) 优先输出id,然后是class(题目中有说) 乘法的部分:fuck*2>you*3 (每次执行fuck时,you的地方同样被执行了3次) 其他跑出样例基本没问题,具体看代码. #include <cstdio> #include <cstring> #include

HDU 4923 (贪心+证明)

Room and Moor Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length, which satisfies that:

HDU 4891 简单模拟

The Great Pan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1035    Accepted Submission(s): 355 Problem Description As a programming contest addict, Waybl is always happy to take part in vario

hdu 2037 贪心

今年暑假不AC Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27361    Accepted Submission(s): 14439 Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" &quo