)
小蓝用黑白棋的 n 个棋子排成了一行他在脑海里想象出了一个长度为 n 的 01 串 T。他发现如果把黑棋当作 1、白棋当作 0这一行棋子是一个长度为 n 的 01 串 S。小蓝如果在 S 中发现一颗棋子和它两边的棋子都不一样可以将其翻转变成另一个颜色。也就是说如果 S 中存在子串 101 或者 010可以选择将其分别变为 111 和 000这样的操作可以无限重复。小蓝想知道最少翻转多少次可以把 S 变成和 T 一模一样import sys input sys.stdin.readline D int(input()) for _ in range(D): S list(input().strip()) T list(input().strip()) n len(S) if S[0] ! T[0] or S[n-1] ! T[n-1]: print(-1) continue cnt 0 for i in range(1,n-1): if S[i] ! T[i]: if S[i] ! S[i1] and S[i] ! S[i-1]: S[i] T[i] cnt 1 else: cnt -1 print(cnt)逻辑分析:“贪心问题”依旧是排序对比。这次换成两个列表逻辑中存在子串 101 或者 010可以选择将其分别变为 111 和 000我们就可以一一比对(注意需要至少连续的3个01片段才能进行比对)这道题重点是要抓到 T 和 S 的首位和末位要相同“01”任取需要相同比如T是1xxxx1那么S也要是1xxxx1题目分析小蓝想出一段只有“01”的数T现在他又写出一段只有“01”的数S通过D次翻转达到相同。需要注意T和S首末都要相同进行翻转要符合“101”转化为“111”反之亦然代码分析“Dint(input())”:定义一个数值输入你想要比对的组数。“n len(S)”:这一步得出步长为后续判断“01”片段做铺垫也可根据遍历将首末判断排除。“if S[0] ! T[0] or S[n-1] ! T[n-1]:”这里根据“逻辑分析”得出S和T的首末位必须相同因此用数组[0]和[n-1]来判断。“for i in range(1,n-1):”这里通过遍历将首末位排除得到的是索引为1到索引为n-2的位置这一步要想清楚根据range(0,n)的特性左闭右开实际只能取到n-1假设总长度为n那么数S的第一索引是0第二索引是1最后一位索引是n-1倒数第二位索引是n-2那么实际的倒数第二位置是n-2示例n6 range(0,n)range(0,6)实际位置 0 1 2 3 4 5索引位置 n-6 n-5 n-4 n-3 n-2 n-1这里我是从首位就是0开始第二位就是1实在是想不清楚就跟我一样在考虑切片的时候写出实际/索引位置一一比对即可“if T[i] ! T[i-1] and T[i] ! T[i1]: S[i] T[i]”在保证S[i]!T[i]的情况下再判断T的前后位是否相同不同的就用S[i]来替换。给定一个长度为N的数列a1、a2、a3...如果其中的一段连续子序列a1、a2、a3....an(ij)之和是K的倍数我们就称这个区间为K倍区间,现在叫你求出有多少个K倍区间import sys input sys.stdin.readline N,K map(int,input().split()) a [] for _ in range(N): num int(input()) a.append(num) total 0 for i in range(N): sum 0 for j in range(i,N): sum a[j] if sum % K 0: total 1 print(total)逻辑分析:这道题跟上一道题的想法一样遇到区间问题列表是第一选择还是以列表的方式循环、切片、判断、得出最终值这里运用到了一点点append()函数(作用是在列表的末尾添加一个数值)题目分析:在一个区间之内从某一个数字开始到某一个数字结束其中所涉及到的数字之和能被K整除那么这个区间为K倍区间不难理解。我们一步步来写。代码分析N,K map(int,input().split())再讲一次map返回迭代器对象input.split字符串输入中间隔个空格int将其转化成整数。a [] for _ in range(N): num int(input()) a.append(num)创建一个空列表遍历次数选择Nnumint(input)),每次输入数字需要换行a.append(num)将输入的num放进a列表中。for i in range(N);for j in range(i,N):这一步需要理解列表的切片范围i和j题目说要找到所有的K倍区间所以我们从最开始遍历并且要遍历到直到完全找出所有区间。sum a[j] 这一步很重要设计到求和的问题来分析外层循环从i开始所以i值不会变内层循环从i到N结束j在变所以我可以通过计算j的值的和来判断是否属于K倍区间。后面的看代码就可以看懂了。综上涉及到列表、循环遍历、切片本质还是贪心问题