题目1 翻转
小蓝用黑白棋的 n 个棋子排成了一行,他在脑海里想象出了一个长度为 n 的 01 串 T,他发现如果把黑棋当做 1,白棋当做 0,这一行棋子也是一个长度为 n 的 01 串 S。
小蓝决定,如果在 S 中发现一个棋子和它两边的棋子都不一样,就可以将其翻转变成另一个颜色。
也就是说,如果 S 中存在子串 101 或者 010,就可以选择将其分别变为 111 和 000,这样的操作可以无限重复。
小蓝想知道最少翻转多少次可以把 S 变成和 T 一模一样。
输入格式
输入包含多组数据。
输入的第一行包含一个正整数 D 表示数据组数。
后面 2D 行每行包含一个 01 串,每两行为一组数据,第 2i−1 行为第 i 组数据的 Ti,第 2i 行为第 i 组数据的 Si,Si 和 Ti 长度均为 ni。
输出格式
对于每组数据,输出一行包含一个整数,表示答案,如果答案不存在请输出 −1
。
数据范围
对于 20% 的评测用例, 1 ≤ ∑ 1 D n i ≤ 10 1≤\sum_{1}^{ D}n_i≤10 1≤∑1Dni≤10;
对于所有评测用例,保证 1 ≤ ∑ 1 D n i ≤ 1 0 6 , n i > 0 1≤\sum_{1}^{ D}n_i≤10^6,ni>0 1≤∑1Dni≤106,ni>0。
输入样例:
2
1000111
1010101
01000
11000
输出样例:
2
-1
思路
按照题意进行模拟:
- 遍历列表元素s,如果s[i]==t[i],继续遍历下一个
- 如果s[i]!=t[i],那么根据题意最终是想让s[i]==t[i],而可以采用的操作是101-->111 or 000,010-->111or 000,那么根据t[i]值,
- t[i]==1,变成111
- t[i]==0,变成000
python代码
python
def culi():
t=list(map(int,input().strip()))
s=list(map(int,input().strip()))
ans=0
for i in range(1,len(s)-1):
if s[i]==t[i]:
continue
else:
if s[i-1:i+2]==[1,0,1] or s[i-1:i+2]==[0,1,0]:
if t[i]==0:
s[i-1:i+2]=[0,0,0]
ans+=1
elif t[i]==1:
s[i-1:i+2]=[1,1,1]
ans+=1
if s==t:
return ans
else:
return -1
n=int(input())
for i in range(n):
print(culi())
知识点
蓝桥杯笔记:蓝桥杯备赛笔记
- 判断列表s==t的时间复杂度是o(n),n为列表长度