第十四届蓝桥杯大赛软件赛省赛Python 大学 C 组:7.翻转

题目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,如果si==ti,继续遍历下一个
  • 如果si!=ti,那么根据题意最终是想让si==ti,而可以采用的操作是101-->111 or 000,010-->111or 000,那么根据ti值,
    • ti==1,变成111
    • ti==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())

知识点

蓝桥杯笔记:蓝桥杯备赛笔记

  1. 判断列表s==t的时间复杂度是o(n),n为列表长度
相关推荐
benben0444 分钟前
强化学习之DQN算法族(基于gymnasium开发)
算法
码云骑士1 小时前
32-慢查询排查全流程(下)-索引优化实战与最左前缀原则
python
何以解忧,唯有..1 小时前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
闵孚龙2 小时前
《PyTorch 深度修炼》Dataset 和 DataLoader:数据如何喂给模型
人工智能·pytorch·python
goldenrolan2 小时前
A公司物料替代测试系统 v1.7:从需求到 exe/apk 的 AI 辅助全链路实践
android·自动化测试·软件测试·python·ai
想吃火锅10052 小时前
【leetcode】88.合并两个有序数组js
算法
菜板春2 小时前
jupyter入门-手册-特征探索
python·jupyter
Metaphor6922 小时前
使用 Python 将 PDF 转换为 HTML
python·pdf·html
极光代码工作室2 小时前
基于数据仓库的电商数据分析平台
大数据·hadoop·python·spark·数据可视化