CF1191B 题解

发布时间 2023-12-19 13:04:38作者: shimingxin1007

原题传送门


题目大意

\(3\) 块麻将,求需要换掉几张牌才能一次出完 \(3\) 块麻将。

每块麻将,用一个长度为 \(2\) 的字符串给出,字符串由 \((1,9)\) 的一位数字和 \(m\)\(s\)\(p\) 组成。

\(3\) 块一模一样的麻将或第 \(2\) 位相同,前面是连号的 \(3\) 块麻将都可以一次性出完。

思路分析

分类讨论所有情况。

首先,为了方便讨论,可以先将 \(3\) 块麻将排一下序。先将同花色放一起,再按数字大小从小到大排序。

如果字符串都完全相同或满足同花色且连号,则不用换牌,输出 0

接着讨论那两块麻将可以放在一起,那么换那块不在一起的麻将,输出 1,详见代码。

我们可以认为,最多只需要换两块与其中一块麻将一样的麻将便可出完,所以最多只有可能换 \(2\) 次。所以,如果不满足以上两种情况,则输出 2

代码:

/*Written by smx*/
#include<bits/stdc++.h>
using namespace std;
string a[3];
bool cmp(string a,string b)
{
	if(a[1]!=b[1])
	{
		return a[1]<b[1];
	}
	else
	{
		return a[0]<b[0];
	}
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>a[0]>>a[1]>>a[2];
	sort(a,a+3,cmp);
	if(a[0]==a[1]&&a[1]==a[2]||a[0][1]==a[1][1]&&a[1][1]==a[2][1]&&a[0][0]+1==a[1][0]&&a[1][0]+1==a[2][0])
	{
		cout<<"0";
	}
	else if(a[0][1]==a[1][1]&&a[0][0]+1==a[1][0]||a[1][1]==a[2][1]&&a[1][0]+1==a[2][0])//任意两块连号,换掉不是连号的那块
	{
		cout<<"1";
	}
	else if(a[0][1]==a[1][1]&&a[0][0]+2==a[1][0]||a[1][1]==a[2][1]&&a[1][0]+2==a[2][0])//任意两块的号相差 1,换一块两个号中间的号
	{
		cout<<"1";
	}
	else if(a[0]==a[1]||a[1]==a[2])//任意两块相同,换一块和它们相同的
	{
		cout<<"1";
	}
	else//最劣情况,否则输出 2
	{
		cout<<"2";
	}
	return 0;
}