【蓝桥杯】翻硬币

文章讨论了一个关于硬币翻转的问题,其中目标是在有限次操作内将一排硬币从初始状态翻转到目标状态,每次可以翻转相邻的两个硬币。通过分析不同情况,文章提出了一个计算最少翻转次数的策略,即计算不同花色硬币之间的差异。给出的C++代码实现用于计算这个最少次数。
摘要由CSDN通过智能技术生成

题目

题目

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo,如果同时翻转左边的两个硬币,则变为 oooo***oooo。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

分析

因为只能连续翻两个,所以改变的情况可以两个两个的对照考虑,总共情况就是以下几种

分类分析可得,前两类只需要翻转一次即可,最后一种需要一直到下一次需要翻转的地方才能更改,由于题目说肯定有解,所以需要一直翻转,直到下一个不同的地方,例如样例1

 将所有情况总结可得出规律,即两个不同花色之间差的和

代码

#include<bits/stdc++.h>
#define pb push_back
#define ll long long
#define guanliu ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const ll maxn=1e5+7;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);

int main()
{
	string s1,s2;
	cin>>s1;
	cin>>s2;
	ll ans=0;
	int j,k,f=0;
	for(int i=0;i<s1.size();i++)
	{
		if(s1[i]!=s2[i]&&f==0)
		{ 
			j=i;
			f=1;
			continue;
		}
		if(s1[i]!=s2[i]&&f==1)
		{
			k=i;
			int t=k-j;
			ans+=t;
			f=0;
		}
	}
	cout<<ans<<endl;
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值