[蓝桥杯 2013 省 B] 翻硬币 题解
题目背景
小明正在玩一个“翻硬币”的游戏。
题目描述
桌上放着排成一排的若干硬币。我们用 *
表示正面,用 o
表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo
,如果同时翻转左边的两个硬币,则变为 oooo***oooo
。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
输入格式
两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 10001000。
数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数。
输入输出样例
输入 #1
**********
o****o****
输出 #1 5
输入 #2
*o**o***o***
*o***o**o***
输出 #2 1
说明/提示
source:蓝桥杯 2013 省 B 组 H 题
代码及思路
#include<iostream> #include<string> using namespace std; int main() { string a,b; cin>>a>>b; int num=0; for(int i=0;i<a.size();i++) { if(a[i]==b[i])continue; else{ a[i]=(a[i]=='o')?'*':'o'; a[i+1]=(a[i+1]=='o')?'*':'o'; num++; } } cout<<num; return 0; }
[蓝桥杯 2015 省 B] 移动距离
题目描述
X 星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3,⋯。
当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为 6 时,开始情形如下:
1 2 3 4 5 6 12 11 10 9 8 7 13 14 15 .....
我们的问题是:已知了两个楼号 m 和 n,需要求出它们之间的最短移动距离。(不能斜线方向移动)
输入格式
输入为 33个整数 w,m,n,空格分开,都在 1 到 10000 范围内。
w 为排号宽度,m,n 为待计算的楼号。
输出格式
要求输出一个整数,表示 m 与 n 两楼间最短移动距离。
输入输出样例
输入 #1 6 8 2
输出 #1 4
输入 #2 4 7 20
输出 #2 5
说明/提示
时限 1 秒, 256M。
蓝桥杯 2015 年省赛 B 组 H 题。
代码及思路
#include<iostream> using namespace std; int main() { int w,m,n; int num=0; cin>>w>>m>>n; //找到m和n 的倍数 int tpm=0,tpn=0; //m和n的余数 int rem=0,ren=0; if(m>n) { int temp=m; m=n; n=temp; } //倍数 tpm=m/w;tpn=n/w; //余数 rem=m%w;ren=n%w; int a=tpm,b=tpn; if(rem==0)a--; if(ren==0)b--; //横着的距离 //距离记得取绝对值 num=((b-a)>0)?(b-a):(a-b); //令倍数成为他的横坐标,余数的变换成为纵坐标 if(tpn%2==1&&ren>0)ren=w-ren; if(tpm%2==1&&rem>0)rem=w-rem; if(tpn%2==0&&ren==0)ren=w-1; if(tpm%2==0&&rem==0)rem=w-1; if(tpn%2==0)ren=ren-1; if(tpm%2==0)rem=rem-1; //竖着的距离 num+=((ren-rem)>0)?(ren-rem):(rem-ren); cout<<num; return 0; }
[蓝桥杯 2021 国 BC] 大写
题目描述
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母转换成大写字母后将字符串输出。
输入格式
输入一行包含一个字符串。
输出格式
输出转换成大写后的字符串。
输入输出样例
输入 #1 LanQiao
输出 #1 LANQIAO
说明/提示
对于所有评测用例, 字符串的长度不超过 100100。
蓝桥杯 2021 国赛 B 组 E 题(C 组 E 题)。
代码及思路
#include<stdio.h> #include<string.h> int main() { char arr[1000]; gets(arr); int n=strlen(arr); for(int i=0;i<n;i++) { if(arr[i]<='Z'&&arr[i]>='A')printf("%c",arr[i]); //大写字母和小写字母相差32,小写字母大 if(arr[i]<='z'&&arr[i]>='a')printf("%c",arr[i]-32); } return 0; }