QFNU-ACM 2020.12.26 Trating
K - Tokitsukaze and Mahjong
题意是有三种麻将(1-9)s、(1-9)m、(1-9)p,主角的手里最初有三个牌(如1s、2s、3s),现有两种可以出的牌:一种是三个相同的(1p、1p、1p),一种是三个连续的(1s、2s、3s)。如果不满足可以添加牌来凑出这两种牌(任意一种打法),问最少添加几个。
自己写的有点麻烦的做法:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
int s[50]= {0},p[50]= {0},m[50]= {0};//对应字母开三个数组
int ss=0,pp=0,mm=0;//每个数组存了几个数
string c;
for(int i=0; i<3; i++)
{
cin>>c;
if(c[1]=='s')
{
ss++;
s[ss]=c[0]-'0';
}
else if(c[1]=='m')
{
mm++;
m[mm]=c[0]-'0';
}
else if(c[1]=='p')
{
pp++;
p[pp]=c[0]-'0';
}
}
sort(s+1,s+ss+1);//排序
sort(m+1,m+mm+1);
sort(p+1,p+pp+1);
int f1,f2;//分别是前两个和后两个数的差
if(ss==3)//分了三种情况,第一种是三个s/三个m/三个p
{
f1=s[2]-s[1];
f2=s[3]-s[2];
if(f1==0)
{
if(f2==0)
cout<<"0"<<endl;
else
cout<<"1"<<endl;
}
else if(f1==1)
{
if(f2==1)
{
cout<<"0"<<endl;
}
else
{
cout<<"1"<<endl;
}
}
else if(f1==2||f2==2)cout<<"1"<<endl;//这里忽略了1 3 5应该输出1的情况,wa了好几次
else
{
if(f2==0||f2==1)
{
cout<<"1"<<endl;
}
else
cout<<"2"<<endl;
}
}
else if(mm==3)
{
f1=m[2]-m[1];
f2=m[3]-m[2];
if(f1==0)
{
if(f2==0)
cout<<"0"<<endl;
else
cout<<"1"<<endl;
}
else if(f1==1)
{
if(f2==1)
{
cout<<"0"<<endl;
}
else
{
cout<<"1"<<endl;
}
}
else if(f1==2||f2==2)cout<<"1"<<endl;
else
{
if(f2==0||f2==1)
{
cout<<"1"<<endl;
}
else
cout<<"2"<<endl;
}
}
else if(pp==3)
{
f1=p[2]-p[1];
f2=p[3]-p[2];
if(f1==0)
{
if(f2==0)
cout<<"0"<<endl;
else
cout<<"1"<<endl;
}
else if(f1==1)
{
if(f2==1)
{
cout<<"0"<<endl;
}
else
{
cout<<"1"<<endl;
}
}
else if(f1==2||f2==2)cout<<"1"<<endl;
else
{
if(f2==0||f2==1)
{
cout<<"1"<<endl;
}
else
cout<<"2"<<endl;
}
}
else if(ss==2)//第二种情况,一个数组有两个数,另一个数组一个
{
int ff=s[2]-s[1];
if(ff==0||ff==1)
cout<<"1"<<endl;
else if(ff==2)cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
else if(mm==2)
{
int ff=m[2]-m[1];
if(ff==0||ff==1)
cout<<"1"<<endl;
else if(ff==2)cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
else if(pp==2)
{
int ff=p[2]-p[1];
if(ff==0||ff==1)
cout<<"1"<<endl;
else if(ff==2)cout<<"1"<<endl;
else
cout<<"2"<<endl;
}
else cout<<"2"<<endl;//第三种情况,一个s一个m一个p,每个数组一个数
}
借鉴了别人的题解,他是用数来区分不同的字母:s不变,m*100,p*1000,这样就不需要用数组了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
int x[5]={0};
string c;
for(int i=1; i<=3; i++)
{
cin>>c;
if(c[1]=='s')
{
x[i]=c[0]-'0';
}
else if(c[1]=='m')
{
x[i]=c[0]-'0'+100;
}
else if(c[1]=='p')
{
x[i]=c[0]-'0'+1000;
}
}
sort(x+1,x+4);
if(x[1]==x[2]&&x[2]==x[3]||(x[2]-x[1]==1&&x[3]-x[2]==1))cout<<"0"<<endl;
else if((x[1]==x[2]||x[2]==x[3])||(x[2]-x[1]==1||x[3]-x[2]==1)||(x[2]-x[1]==2||x[3]-x[2]==2))cout<<"1"<<endl;
else cout<<"2"<<endl;
}