首页 > 其他分享 >CF1191B 题解

CF1191B 题解

时间:2023-12-19 13:11:47浏览次数:37  
标签:string 题解 麻将 && 字符串 CF1191B

原题传送门


题目大意

\(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;
}

标签:string,题解,麻将,&&,字符串,CF1191B
From: https://www.cnblogs.com/shimingxin1007/p/17913493.html

相关文章

  • CF175B 题解
    原题传送门题目大意如题目描述。思路分析\(1≤n≤1000\),很明显\(\mathcal{O(n^2)}\)不超时,使用结构体,暴力即可。利用双循环求出名字相同的结构体并判断最高分,再根据字典序排序,再双循环求出比自己优秀人数,输出即可。代码:/*Writtenbysmx*/#include<bits/stdc++.h>usin......
  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......
  • Queries for the Array 题解
    前言这场CF是我赛后打的,vp赛时没做出来,后来发现是有个地方理解错了,有一些细节没有考虑到。现在换了一种思路来写,感觉更清晰了。做法首先需要动态维护三个变量,\(cnt\)和\(finishsort\)和\(unfinishsort\)。这三个变量分别表示当前数字的个数,已经排好序的最后一个位置,和没......
  • poker 题解
    原题链接:poker赛时只有\(40\)分,改完之后感觉是一道好题,于是就来写篇题解。题意有\(k\)张扑克牌,\(n\)种数字,每张牌都有两面,每一面分别写了一个数字,你可以选择打出这张牌的任意一面,但是不能两面同时打,也可以选择不打这张牌。有\(q\)个询问,每个询问给定\(l\)和\(r\),判断......
  • P3694 邦邦的大合唱站队 题解
    原题链接:P3694思路状态设计因为这道题\(m\)的范围非常小,所以可以用\(m\)来作为状态。设\(dp_{i}\)表示\(m\)支队伍的状态为\(i\)时最少让多少偶像出列。预处理在转移之前,我们先要预处理出序列的前缀和\(sum_{i,j}\)表示第\(i\)个数之前有多少个值为\(j\)......
  • [AGC054C] Roughly Sorted 题解
    题意定义一种操作为交换\(a_{i}\)和\(a_{i-1}\)。对于一个长度为\(n\)的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个\(1\lei\len\),都满足包含\(a_i\)的逆序对的个数不超过\(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可......
  • P2391 白雪皑皑 题解
    原题链接:P2391。并查集好题。首先我们知道,并查集在一个无向图中可以维护两点之间的连通性,判断条件为:\(find(u)==find(v)\)。而对于这道题来说,我们可以用并查集来维护一个序列区间的重叠性或者说区间的连通性。因为题目上说了后面的操作会覆盖前面的操作,所以我们可以考虑倒序进行......
  • [ABC239Ex] Dice Product 2 题解
    原题链接:ABC239Ex。题意不多赘述。看到求期望值,我们想到可以用期望DP。设\(dp_{i}\)表示最终结果大于等于\(i\)时的操作次数的期望值。那么我们可以得到一个基本的状态转移方程:\(dp_{i}=\frac{1}{n}\times\sum_{j=1}^{n}dp_{\left\lceil\frac{i}{j}\right\rceil}+......
  • Prefix Purchase 题解
    题意给定一个长度为\(n\)的序列\(ans\),初始值全部为\(0\)。你一共有\(k\)个硬币,你可以选择花\(a_{i}\)个硬币来使\(ans_{1}\)到\(ans_{i}\)中的所有数加一。求最终能得到的\(ans\)序列中字典序最大的一个。思路首先我们可以发现一个很显然的性质:如果满足\(a_{i}......
  • Sum of XOR Functions 题解
    题意给定一个数\(n\)和一个包含\(n\)个数的序列\(a\),求出以下式子模\(998244353\)的值:\(\sum_{i=1}^{n}\sum_{j=i}^{n}f(i,j)\times(j-i+1)\)。其中\(f(i,j)\)的值为\(a_{i}\oplusa_{i+1}\oplusa_{i+2}\oplus...\oplusa_{j}\)。思路首先我们可以考虑这道题的......