HDOJ-1528 Card Game Cheater (贪心,田忌赛马)

博客介绍了HDOJ-1528题目的解决方案,Eve如何在与Adam的扑克牌游戏中通过贪心策略获得最高得分。将牌面转化为数字后,对双方的牌进行顺序比较,以实现类似田忌赛马的策略,但因牌面大小不重复,避免了平局情况。博客提供了实现这一策略的AC代码。
摘要由CSDN通过智能技术生成

题目:HDOJ-1528

题目描述:
Adam和Eve玩一副扑克牌,两边分到相同数量的牌,摆好以后对应位置的牌比大小,每个对应位置,谁的牌大谁得一分。Adam牌已经摆好位置,Eve已经知道Adam所有位置的牌是什么,求Eve能得到的最多分数。
牌的大小2<3<4<…<9<T<J<Q<K<A,当牌大小相同时,花色C<D<S<H。

思路:
将牌面统一转化成对应大小顺序的数字进行存储,牌的大小2,3,4,…,K,A对应20,30,40,…,130,140,牌的花色C,D,S,H对应1,2,3,4,然后两者相加。
同样的两边按顺序排好,依次比较,这里比田忌赛马简单的就是,不会存在相同的牌,每一对牌一定有胜负而不存在平局。

以下AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
void read(int x[],int i)  //读取操作
{
	char v, s;     //v为大小,s为花色
	v = getchar();
	s = getchar();
	if ('2' <= v && v <= '9')
		x[i] = (v - '0') * 10;
	else if (v == 'T')
		x[i] = 10 * 10;
	else if (v == 'J')
		x[i] = 11 * 10;
	else if (v == 'Q')
		x[i] = 12 * 10;
	else if (v == 'K')
		x[i] = 13 * 10;
	else if (v == 'A')
		x[i] = 14 * 10;
	if (s == 'C')
		x[i] += 1;
	else if (s == 'D')
		x[i] += 2;
	else if (s == 'S')
		x[i] += 3;
	else if (s == 'H')
		x[i] += 4;
}
int main()
{
	int a[27], e[27];
	int pa, pes,pee;
	int N, k, i,ans;
	scanf("%d", &N);
	while (N--)
	{
		scanf("%d", &k);
		ans = 0;
		for (i = 0; i < k; i++)
		{
			getchar();
			read(a, i);
		}
		for (i = 0; i < k; i++)
		{
			getchar();
			read(e, i);
		}
		sort(a, a + k);
		sort(e, e + k);    //均从小到大排序
		pa = k - 1;    //pa初始指向Adam牌末尾(最大牌)
		pes = 0;       //pes指向Eve牌开头
		pee = k - 1;    //pee指向Eve牌末尾
		while (1)      //不用考虑相同牌的田忌赛马
		{
			if (e[pee] > a[pa])
			{
				pee--;
				pa--;
				ans++;
			}
			else
			{
				if (e[pes] > a[pa])
					ans++;
				pes++;
				pa--;
			}
			if (pa < 0)
				break;
		}
		printf("%d\n", ans);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值