题意:
方法一:
直接模拟
思路:
遍历字符串,将其分割为两个字符串数组,并按下图所示规则比较两个字符串数组:
#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int> mp;
vector<string> a;
vector<string> b;
//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
int n1=a.size();
int n2=b.size();
if(n1==1){//左边牌数是1
if(n2==1){//右边字符串长度为1,则比较首字符
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n2==2){//右边字符串是对王
if(b[0]=="joker"||b[0]=="JOKER")
return -1;
}else if(n2==4){//右边字符串是炸弹
return -1;
}
return 0;
}else if(n1==2){//左边牌数是2
if(a[0]=="joker"||a[0]=="JOKER")
return 1;
if(n2==2){//右边字符串长度为2,则比较首字符
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n2==4){//右边字符串是炸弹
return -1;
}
return 0;
}else if(n1==3){//左边牌数是3
if(n2==3){//右边字符串长度为3,则比较首字符
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n2==2){//右边字符串是对王
if(b[0]=="joker"||b[0]=="JOKER")
return -1;
}else if(n2==4){//右边字符串是炸弹
return -1;
}
return 0;
}else if(n1==4){//左边牌数是4
if(n2==4){//右边字符串长度为4,则比较首字符
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n2==2){//右边字符串是对王
if(b[0]=="joker"||b[0]=="JOKER")
return -1;
}
return 1;
}else if(n1==5){//左边牌数是5
if(n2==5){//右边字符串长度为5,则比较首字符
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n2==2){//右边字符串是对王
if(b[0]=="joker"||b[0]=="JOKER")
return -1;
}else if(n2==4){//右边字符串是炸弹
return -1;
}
return 0;
}
return 0;
}
int main(){
//初始化
for(int i=3;i<=10;i++)
mp[to_string(i)]=i;
mp["J"]=11;
mp["Q"]=12;
mp["K"]=13;
mp["A"]=14;
mp["2"]=15;
mp["joker"]=16;
mp["JOKER"]=17;
string s;
while(getline(cin,s)){//输入
a.clear();
b.clear();
s+=" ";
int len=s.size();
string x="";
int flag=0;
for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
if(s[i]==' '||s[i]=='-'){
if(flag==0)
a.push_back(x);
else
b.push_back(x);
x="";
if(s[i]=='-')
flag=1;
}else{
x+=s[i];
}
}
int t=cmp();//比较
if(t==0){//无法比较
cout << "ERROR\n";
}else if(t>0){//左边大
for(int i=0;i<a.size();i++)
cout << a[i] << " ";
cout << endl;
}else{//右边大
for(int i=0;i<b.size();i++)
cout << b[i] << " ";
cout << endl;
}
}
return 0;
}
时间复杂度:
空间复杂度:![]()
方法二:
优化
思路:左右边字符串数组比较规则:(比较顺序)
1.比较左右边字符串是否为对王;2.左右边字符串都为4的情况;
3.左右边字符串都为1的情况;
4.左右边字符串都为2的情况;5.左右边字符串都为3的情况;6.左右边字符串都为5的情况。(其中顺序3、4、5、6可以随意对调)。
#include <bits/stdc++.h>
using namespace std;
unordered_map<string,int> mp;
vector<string> a;
vector<string> b;
//0表示无法比较,1表示左边大于右边,-1表示右边大于左边
int cmp(){
int n1=a.size();
int n2=b.size();
if(n1==2&&(a[0]=="joker"||a[0]=="JOKER"))//左边字符串是对王
return 1;
if(n2==2&&(b[0]=="joker"||b[0]=="JOKER"))//右边字符串是对王
return -1;
if(n1==4&&n2==4){//左右边字符串都为4
return mp[a[0]]>mp[b[0]]?1:-1;
}else if(n1==4)//左边字符串都为4
return 1;
else if(n2==4)//右边字符串都为4
return -1;
if(n1==5&&n2==5)//左右边字符串都为5
return mp[a[0]]>mp[b[0]]?1:-1;
if(n1==3&&n2==3)//左右边字符串都为3
return mp[a[0]]>mp[b[0]]?1:-1;
if(n1==2&&n2==2)//左右边字符串都为2
return mp[a[0]]>mp[b[0]]?1:-1;
if(n1==1&&n2==1)//左右边字符串都为1
return mp[a[0]]>mp[b[0]]?1:-1;
return 0;
}
int main(){
//初始化
for(int i=3;i<=10;i++)
mp[to_string(i)]=i;
mp["J"]=11;
mp["Q"]=12;
mp["K"]=13;
mp["A"]=14;
mp["2"]=15;
mp["joker"]=16;
mp["JOKER"]=17;
string s;
while(getline(cin,s)){//输入
a.clear();
b.clear();
s+=" ";
int len=s.size();
string x="";
int flag=0;
for(int i=0;i<len;i++){//遍历字符串,得到分割的单词
if(s[i]==' '||s[i]=='-'){
if(flag==0)
a.push_back(x);
else
b.push_back(x);
x="";
if(s[i]=='-')
flag=1;
}else{
x+=s[i];
}
}
int t=cmp();//比较
if(t==0){//无法比较
cout << "ERROR\n";
}else if(t>0){//左边大
for(int i=0;i<a.size();i++)
cout << a[i] << " ";
cout << endl;
}else{//右边大
for(int i=0;i<b.size();i++)
cout << b[i] << " ";
cout << endl;
}
}
return 0;
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号