[Lydsy2017年4月月赛]打牌

[Lydsy2017年4月月赛]打牌

题目描述

小 Q 同学正在和糖老师一起打(d)牌(p)。这个游戏需要 525252 张牌,分为四种花色(H 表示红心,S 表示黑桃,C 表示梅花 ,D 表示方块),每种花色有 A,K,Q,J,10,9,8,7,6,5,4,3,2 这么多张牌,其中 A 是最大的,2 是最小的。

游戏的第一轮从小 Q 同学开始,他会先展示一张牌,然后轮到糖老师展示一张牌。双方都展示完手牌之后进入结算环节, 展示较大的牌的人会获得这一轮的胜利(如果两个人展示的牌大小相同那么先展示牌的人获胜),并且得到较大的牌对应的分值,分值就是牌上的数字,比如 J 是 11,Q 是 12,K是 13,A 是 1。结算后扔掉这一轮展示的牌,然后从上一轮 的获胜者开始下一轮,游戏进行到双方打完所有牌为止。

为了简单起见,现在每个人都只有两张牌,并且全过程中双方都能看到对方的手牌,也就是明牌打。你需要求出两个人都使用最优策略的情况下,小 Q 同学的得分减去糖老师的得分的最大值。

输入格式

第一行是一个正整数 T,表示测试数据的组数。

每组测试数据包含两行,每行有两张牌,分别表示小 Q 和糖老师手上的牌。每张牌会按照 XY 的格式给出,其中 XA,K,Q,J,T(表示10),9,8,7,6,5,4,3,2 之一, Y 是花色(H,S,C,D 之一)。保证任何一张牌至多出现一次。

输出格式

对于每组测试数据,输出一个整数,表示结果。

样例输入

2
AH 2S
3C 4D
2H 5S
3C 4D

样例输出

-3 
1

数据范围与约定

对于 100% 的数据,1≤T≤1e4。

其实感觉就是一道阅读理解题

题解

这道题只要你看懂了,暴力就行,唯一麻烦的是花色的处理好像也不麻烦
关键要理解最优策略,两个人是明牌打的,所以当一个人出完牌后另一个人肯定希望得分最大或者失分最小(=另一个人的得分最小),就此按照四种方案即可。

标程

#include<bits/stdc++.h>
using namespace std;
int T;
int val[200];
int a,b,c,d;
char q[14]={0,'A','2','3','4','5','6','7','8','9','T','J','Q','K'};
int t1,t2,t3,t4;
int read(){
	char s[5];
	scanf("%s",s);
	return val[s[0]];
}
int get(int x,int y){
	if(x==y||x==1)return x;
	if(y>x||y==1)return -y;
	if(x>y)return x;
}
int calc(int x1,int y1,int x2,int y2){
	int ans=get(x1,y1);
	if(ans>0)return ans+get(x2,y2);
	else return ans-get(y2,x2);
}
void solve(){
	t1=calc(a,c,b,d);
	t2=calc(a,d,b,c);
	t3=calc(b,c,a,d);
	t4=calc(b,d,a,c);
}
int main(){
	//freopen("card.in","r",stdin);
	//freopen("card.out","w",stdout);
	scanf("%d",&T);
	for(int i=1;i<=13;++i)val[q[i]]=i;
	while(T--){
		a=read(),b=read(),c=read(),d=read();
		solve();
		int ans1=min(t1,t2);
		int ans2=min(t3,t4);
		printf("%d\n",max(ans1,ans2));
	}
	return 0;
}
posted @ 2021-08-06 17:35  fanner_rick  阅读(82)  评论(0)    收藏  举报