Week9 作业B - 东东学打牌

1.题意

最近,东东沉迷于打牌。所以他找到 HRZ、ZJM 等人和他一起打牌。由于人数众多,东东稍微修改了亿下游戏规则:

所有扑克牌只按数字来算大小,忽略花色。
每张扑克牌的大小由一个值表示。A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K 分别指代 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13。
每个玩家抽得 5 张扑克牌,组成一手牌!(每种扑克牌的张数是无限的,你不用担心,东东家里有无数副扑克牌)
理所当然地,一手牌是有不同类型,并且有大小之分的。

举个栗子,现在东东的 “一手牌”(记为 α),瑞神的 “一手牌”(记为 β),要么 α > β,要么 α < β,要么 α = β。

那么这两个 “一手牌”,如何进行比较大小呢?首先对于不同类型的一手牌,其值的大小即下面的标号;对于同类型的一手牌,根据组成这手牌的 5 张牌不同,其值不同。下面依次列举了这手牌的形成规则:

大牌:这手牌不符合下面任一个形成规则。如果 α 和 β 都是大牌,那么定义它们的大小为组成这手牌的 5 张牌的大小总和。

对子:5 张牌中有 2 张牌的值相等。如果 α 和 β 都是对子,比较这个 “对子” 的大小,如果 α 和 β 的 “对子” 大小相等,那么比较剩下 3 张牌的总和。

两对:5 张牌中有两个不同的对子。如果 α 和 β 都是两对,先比较双方较大的那个对子,如果相等,再比较双方较小的那个对子,如果还相等,只能比较 5 张牌中的最后那张牌组不成对子的牌。

三个:5 张牌中有 3 张牌的值相等。如果 α 和 β 都是 “三个”,比较这个 “三个” 的大小,如果 α 和 β 的 “三个” 大小相等,那么比较剩下 2 张牌的总和。

三带二:5 张牌中有 3 张牌的值相等,另外 2 张牌值也相等。如果 α 和 β 都是 “三带二”,先比较它们的 “三个” 的大小,如果相等,再比较 “对子” 的大小。

炸弹:5 张牌中有 4 张牌的值相等。如果 α 和 β 都是 “炸弹”,比较 “炸弹” 的大小,如果相等,比较剩下那张牌的大小。

顺子:5 张牌中形成 x, x+1, x+2, x+3, x+4。如果 α 和 β 都是 “顺子”,直接比较两个顺子的最大值。

龙顺:5 张牌分别为 10、J、Q、K、A。

作为一个称职的魔法师,东东得知了全场人手里 5 张牌的情况。他现在要输出一个排行榜。排行榜按照选手们的 “一手牌” 大小进行排序,如果两个选手的牌相等,那么人名字典序小的排在前面。

不料,此时一束宇宙射线扫过,为了躲避宇宙射线,东东慌乱中清空了他脑中的 Cache。请你告诉东东,全场人的排名

2.样例

Input

输入包含多组数据。每组输入开头一个整数 n (1 <= n <= 1e5),表明全场共多少人。
随后是 n 行,每行一个字符串 s1 和 s2 (1 <= |s1|,|s2| <= 10), s1 是对应人的名字,s2 是他手里的牌情况

Output

对于每组测试数据,输出 n 行,即这次全场人的排名。

Sample Input

3
DongDong AAA109
ZJM 678910
Hrz 678910

Sample Output

Hrz
ZJM
DongDong

3.解题思路

  1. 该题是简化的扑克牌,且可以看出是多关键字排序,首先是排名,其次是对应的比较,最后为字典序,所以采用结构体排序方式
  2. 由于一直TLE,一开始以为复杂度问题所以写了两个代码,后来发现将cin、cout换为scanf、printf后分别8ms,10ms完成,两个代码的思想都是根据牌的规则决定其排名以及剩余比较参数,第一个代码是用三个数组记录不同数出现的次数,第二个代码直接对牌排序,暴力枚举判断

4.AC代码

  1. 代码1
#include<stdio.h>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<map>
#include<cstring>
#include<string.h>
using namespace std;
const int M=1e5+5;
struct player{
	string name;
	string pi;
	int mark;
	int cp1;
	int cp2;
	int cp3;
	player(string s1,string s2)
	{
		name=s1;
		pi=s2;
		mark=0;
		cp1=0;
		cp2=0;
		cp3=0;
	}
	bool operator < (const player &pl)const{
		if(mark!=pl.mark)
		{
			return mark>pl.mark;
		}
		if(cp1!=pl.cp1)
		{
			return cp1>pl.cp1;
		}
		if(cp2!=pl.cp2)
		{
			return cp2>pl.cp2;
		}
		if(cp3!=pl.cp3)
		{
			return cp3>pl.cp3;
		}
		return name<pl.name;
	}
};
vector<player>v;
map<char,int>m;
int n;
int a[14];
int b[14]; 
int c[7];

void clas(string str,int i)
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	int ct=0,mark=0,cp1=0,cp2=0,cp3=0;
	bool check=false;
	for(int i=0;i<str.size();i++)
	{
		if(str[i]=='A')
		{
			ct=1;
			b[ct]++;
		} 
		else if(str[i]>='2'&&str[i]<='9')
		{
			ct=str[i]-'0';
			b[ct]++;
		}
		else if(str[i]=='1')
		{
			ct=10;
			b[ct]++;
		}
		else if(str[i]=='J')
		{
			ct=11;
			b[ct]++;
		}
		else if(str[i]=='Q')
		{
			ct=12;
			b[ct]++;
		}
		else if(str[i]=='K')
		{
			ct=13;
			b[ct]++;
		}
	}
	int mx=0,mn=0; 
	for(int i=0;i<14;i++)
	{
		if(b[i]!=0)
		{
			c[b[i]]++;
			mx=i;
		}
	}
	for(int i=0;i<14;i++)
	{
		if(b[i]!=0)
		{
			mn=i;
			break;
		}
	}
	
	if(b[1]==1&&b[10]==1&&b[11]==1&&b[12]==1&&b[13]==1)
	{
		mark=8;
		check=true;
	}
	else if(c[1]==5&&mx-mn+1==5)
	{
		mark=7;
		check=true;
	}
	else if(c[4]==1)
	{
		mark=6;
		check=true;
	}
	else if(c[2]==1&&c[3]==1)
	{
		mark=5;
		check=true;
	}
	else if(c[3]==1)
	{
		mark=4;
		check=true;
	}
	else if(c[2]==2)
	{
		mark=3;
		check=true;
	}
	else if(c[2]==1)
	{
		mark=2;
		check=true;
	}
	if(check==false)
	{
		mark=1;
	}
	int k1=0,k2=0,k3=0,k4=0,k5=0,k6=0;
	if(mark==1)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]!=0)
			{
				k1+=i;
			}
		}
		cp1=k1;
		cp2=0;
		cp3=0;
	}
	else if(mark==2)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]!=0)
			{
				if(b[i]==2)
				{
					k1=i;
				}
				if(b[i]!=2)
				{
					k2+=i;
				}
			}
		}
		cp1=k1;
		cp2=k2;
		cp3=0;
	}
	else if(mark==3)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]!=0)
			{
				if(k1==0&&b[i]==2)
				{
					k1=i;
				} 
				if(k1!=0&&b[i]==2)
				{
					k2=i;
				}
				if(b[i]!=2)
				{
					k3=i;
				}
			}
		}
		cp1=k2;
		cp2=k1;
		cp3=k3;
	}
	else if(mark==4)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]!=0)
			{
				if(b[i]==3)
				{
					k1=i;
				}
				if(b[i]!=3)
				{
					k2+=i;
				}
			}
		}
		cp1=k1;
		cp2=k2;
		cp3=0;
	}
	else if(mark==5)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]==3)
			{
				k1=i;
			}
			if(b[i]==2)
			{
				k2=i;
			}
		}
		cp1=k1;
		cp2=k2;
		cp3=0;
	}
	else if(mark==6)
	{
		for(int i=0;i<14;i++)
		{
			if(b[i]==4)
			{
				k1=i;
			}
			if(b[i]!=0&&b[i]!=4)
			{
				k2=i;
			}
		}
		cp1=k1;
		cp2=k2;
		cp3=0;
	}
	else if(mark==7)
	{
		cp1=mx;
		cp2=0;
		cp3=0;
	}
	else if(mark==8)
	{
		cp1=0;
		cp2=0;
		cp3=0;	
	}
	v[i].mark=mark;
	v[i].cp1=cp1;
	v[i].cp2=cp2;
	v[i].cp3=cp3;
}
int main()
{
	char s1[11],s2[11];
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
		{
			scanf("%s %s",s1,s2);
			v.push_back(player(s1,s2));
			clas(s2,i);
		}
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i++)
		{
			string str=v[i].name;
			printf("%s\n",str.c_str());
		}
		v.clear();
	}
	return 0;
}
  1. 代码2
#include<iostream>
#include<vector>
#include<queue>
#include<string>
#include<algorithm>
#include<map>
#include<cstring>
#include<string.h>
using namespace std;
struct player{
	string name;
	string pi;
	int mark;
	int cp1;
	int cp2;
	int cp3;
	player(string s1,string s2)
	{
		name=s1;
		pi=s2;
		mark=0;
		cp1=0;
		cp2=0;
		cp3=0;
	}
	bool operator < (const player &pl)const{
		if(mark!=pl.mark)
		{
			return mark>pl.mark;
		}
		if(cp1!=pl.cp1)
		{
			return cp1>pl.cp1;
		}
		if(cp2!=pl.cp2)
		{
			return cp2>pl.cp2;
		}
		if(cp3!=pl.cp3)
		{
			return cp3>pl.cp3;
		}
		return name<pl.name;
	}
};
vector<player>v;
map<char,int>m;
int n;
int a[5];
void ini()
{
	m['A']=1;
	m['2']=2;
	m['3']=3;
	m['4']=4;
	m['5']=5;
	m['6']=6;
	m['7']=7;
	m['8']=8;
	m['9']=9;
	m['S']=10;
	m['J']=11;
	m['Q']=12;
	m['K']=13;
}
void clas(string str,int i)
{
	memset(a,0,sizeof(a));
	int ct=0,mark=0,cp1=0,cp2=0,cp3=0;
	for(int i=0;i<str.size();i++)
	{
		if(i<str.size()-1&&str[i+1]=='0')
		{
			a[ct]=m['S'];
			i++;
			ct++;
		}
		else
		{
			a[ct]=m[str[i]];
			ct++;
		}
	}
	sort(a,a+5);
	if(a[0]==1&&a[1]==10&&a[2]==11&&a[3]==12&&a[4]==13)
	{
		mark=8;
		cp1=0;
		cp2=0;
		cp3=0;
	}
	else if(a[0]==a[1]-1&&a[1]==a[2]-1&&a[2]==a[3]-1&&a[3]==a[4]-1)
	{
		mark=7;
		cp1=a[4];
		cp2=0;
		cp3=0;
	}
	else if(a[0]==a[3]||a[1]==a[4])
	{
		mark=6;
		if(a[0]==a[3])
		{
			cp1=a[0];
			cp2=a[4];
			cp3=0;
		}
		if(a[1]==a[4])
		{
			cp1=a[4];
			cp2=a[0];
			cp3=0;
		}
	}
	else if(a[0]==a[2]&&a[3]==a[4])
	{
		mark=5;
		cp1=a[0];
		cp2=a[4];
		cp3=0;
	}
	else if(a[0]==a[1]&&a[2]==a[4])
	{
		mark=5;
		cp1=a[4];
		cp2=a[0];
		cp3=0;
	}
	else if(a[0]==a[2]||a[1]==a[3]||a[2]==a[4])
	{
		mark=4;
		if(a[0]==a[2])
		{
			cp1=a[0];
			cp2=a[3]+a[4];
			cp3=0;
		}
		else if(a[1]==a[3])
		{
			cp1=a[1];
			cp2=a[0]+a[4];
			cp3=0;
		}
		else if(a[2]==a[4])
		{
			cp1=a[2];
			cp2=a[0]+a[1];
			cp3=0;
		}
	}
	else if(a[0]==a[1]&&a[2]==a[3])
	{
		mark=3;
		cp1=a[2];
		cp2=a[0];
		cp3=a[4]; 
		
	}
	else if(a[0]==a[1]&&a[3]==a[4])
	{
		mark=3;
		cp1=a[3];
		cp2=a[0];
		cp3=a[2]; 
	}
	else if(a[1]==a[2]&&a[3]==a[4])
	{
		mark=3;
		cp1=a[3];
		cp2=a[1];
		cp3=a[0];	
	}
	else if(a[0]==a[1])
	{
		mark=2;
		cp1=a[0];
		cp2=a[2]+a[3]+a[4];
		cp3=0;
	}
	else if(a[1]==a[2])
	{
		mark=2;
		cp1=a[1];
		cp2=a[0]+a[3]+a[4];
		cp3=0;
	}
	else if(a[2]==a[3])
	{
		mark=2;
		cp1=a[2];
		cp2=a[0]+a[1]+a[4];
		cp3=0;
	}
	else if(a[3]==a[4])
	{
		mark=2;
		cp1=a[3];
		cp2=a[0]+a[1]+a[2];
		cp3=0;
	}
	else
	{
		mark=1;
		cp1=a[0]+a[1]+a[2]+a[3]+a[4];
		cp2=0;
		cp3=0;
	}
	v[i].mark=mark;
	v[i].cp1=cp1;
	v[i].cp2=cp2;
	v[i].cp3=cp3;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	ini();
	//string s1,s2;
	char s1[11],s2[11];
	while(~scanf("%d",&n))
	{
		for(int i=0;i<n;i++)
		{
			//cin>>s1>>s2;
			scanf("%s %s",s1,s2);
			v.push_back(player(s1,s2));
			//v[i].name=s1;
			//v[i].pi=s2;
			clas(s2,i);
		}
		sort(v.begin(),v.end());
		for(int i=0;i<v.size();i++)
		{
			string str=v[i].name;
			//cout<<str<<endl;
			printf("%s\n",str.c_str());
		}
		v.clear();
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值