HDOJ 1528. Card Game Cheater

概述

    两个人在用一幅扑克牌比大小,给定牌,问第二个人最多能赢第一个人几张牌。 

思路

    乍一看是典型的二分匹配,实际无需繁琐的建图过程。

    贪心策略是显而易见的:如果要选择一张牌赢或不赢,赢比不赢好,而且赢越大的牌越好。

    因此对两组牌从大向小遍历即可。

代码

#include<bits\stdc++.h> 
typedef long long ll;
using namespace std; 

const int N = 52;
bool op[N];
bool my[N];
int opp,myp;

int c2n(char* c)
{
	int n;
	if(*c>='2' && *c<='9')
		n=*c-'2';
	else if(*c=='T') n=8;
	else if(*c=='J') n=9;
	else if(*c=='Q') n=10;
	else if(*c=='K') n=11;
	else if(*c=='A') n=12;
	n*=4;
	c++;
	if(*c=='D') n+=1;
	else if(*c=='S') n+=2;
	else if(*c=='H') n+=3;
	return n;
}

int main()  
{
	int nu,n,c;
	char in[3];
	cin>>nu;
	while(nu--){
		memset(op,0,sizeof(op));
		memset(my,0,sizeof(my));
		opp=N-1,myp=N-1;
		c=0;
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>in;
			op[c2n(in)]=1;
		}for(int i=0;i<n;i++){
			cin>>in;
			my[c2n(in)]=1;
		}
		while(myp && opp>-1){
			if(my[myp--]){
				if(opp>myp) opp=myp;
				while(opp>-1 && !op[opp--]);
				if(op[opp+1]) c++;
			}
		}
		cout<<c<<endl;
	}
	return 0;
}


http://www.cnblogs.com/hizcard/  转载请注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值