概述
两个人在用一幅扑克牌比大小,给定牌,问第二个人最多能赢第一个人几张牌。
思路
乍一看是典型的二分匹配,实际无需繁琐的建图过程。
贪心策略是显而易见的:如果要选择一张牌赢或不赢,赢比不赢好,而且赢越大的牌越好。
因此对两组牌从大向小遍历即可。
代码
#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/ 转载请注明出处