hdu 1528【Card Game Cheater】

#include <iostream>
#include <cstring>
#include <string>
#include <vector>
using namespace std;

vector<int> card[100];
int n;
bool vis[100];
int link[100];

int num_pre(char a)
{
	static string pre = "23456789TJQKA";
	for(int i = 0;i < pre.size();i ++)
	{
		if(a == pre.at(i))
			return i;
	}

	return pre.size();
}

int num_suf(char a)
{
	static string suf = "CDSH";
	for(int i = 0;i < suf.size();i ++)
	{
		if(a == suf.at(i))
			return i;
	}

	return suf.size();
}

bool is_big(const string& a,const string& b)
{
	int aa = num_pre(a.at(0));
	int bb = num_pre(b.at(0));
	if(aa == bb)
		return num_suf(a.at(1)) > num_suf(b.at(1));

	return aa > bb;
}

bool can(int x)
{
	int len = card[x].size();
	for(int i = 0;i < len;i ++)
	{
		int t = card[x].at(i);
		if(!vis[t])
		{
			vis[t] = true;
			if(link[t] == -1 || can(link[t]))
			{
				link[t] = x;
				return true;
			}
		}
	}

	return false;
}

int maxmatch()
{
	int num = 0;
	for(int i = 0;i < n;i ++)
	{
		memset(vis,false,sizeof(vis));
		if(can(i))
			num ++;
	}

	return num;
}

int main()
{
	int cas;
	cin >> cas;
	while(cas --)
	{
		cin >> n;
		memset(link,-1,sizeof(link));
		for(int i = 0;i < n;i ++)
		{
			card[i].clear();
		}
		string ss[100];
		for(int i = 0;i < n;i ++)
		{
			cin >> ss[i];
		}
		string ee;
		for(int i = 0;i < n;i ++)
		{
			cin >> ee;
			for(int j = 0;j < n;j ++)
			{
				if(is_big(ee,ss[j]))
					card[j].push_back(i);
			}
		}

		printf("%d\n",maxmatch());
	}

	return 0;
}
 表示自己写的很暴力...懒得一个一个的比较,直接用字符串比较...貌似复杂了............
原文地址:https://www.cnblogs.com/Shirlies/p/2497889.html