A.Doremy's Paint 3
题目
一个元素全为整数的数组,如果满足相邻两个元素和相同,我们就认定此数组is good。给定一个长度为n的数组a,可以任意改变元素顺序,判定数组a是否is good。
输入
首行t测试数据数量,
每组数据第一行n,数组长度,
第二行数组a的n个数字,
输出
"YES"或“NO”,判定a是否is good。
解析
相邻元素和相同,等价于数组中奇数位置元素相同,偶数位置元素相同。故数组中最多出现两种元素,即奇数位和偶数位数字不同的情况。同时奇数位数字出现个数最多比偶数位数字出现次数多一,否则组不成数组。故,只需遍历数组统计奇偶位数字出现次数即可,时间复杂度。
代码
T = int(input().strip())for t in range(T):n = int(input().strip())a = list(map(int, input().strip().split()))s = set(a)if len(s) > 2:print("NO")elif len(s) == 2:odd = a.count(a[0])even = n - oddif abs(odd - even) <= 1:print("YES")else:print("NO")else:#奇偶位数字相同print("YES")
B.Qingshan Loves Strings
题目
一个字符串s,一个字符串t,由0和1组成。定义一个字符串is good需要满足相邻字符不同,如1或101或0101字符串is good。判断通过将t插入到s的任意位置,是否可以让s is good。
输入
首行t测试数据数量,
每组数据第一行s长度n和t长度m,
第二行s
第三行t
输出
YES or NO
解析
如果s不满足is good,说明s中有连续的1或0,能够将连续1分开的只有以0开头和结尾的t,能够将连续0分开的只有以1开头和结尾的t,故答案为YES的只有上述三种情况。时间复杂度粗略估计,绰绰有余。
代码
T = int(input().strip())def check(s):l = 1for c in s:if c == l:return Falseelse:l = creturn Truefor k in range(T):n, m = map(int, input().strip().split())s = input().strip()t = input().strip()if check(s): # 遗漏点print("YES")else:if check(t):if t[0] == t[-1] == "0" and s.count("00") == 0:print("YES")elif t[0] == t[-1] == "1" and s.count("11") == 0:print("YES")else:print("NO")else:print("NO")
C.Qingshan Loves Strings 2
题目
字符串s由0和1组成,定义一个字符串is good需要满足:第一个与倒数第一个字符不同,第二个与倒数第二个不同,依次类推。 可以执行的操作只有一个,向s任意位置插入“01”字符串,判断字符串s是否能在300次以内的操作满足is good条件。
输入
首行t测试数据数量,
每个测试样例首行为字符串s的长度n,
第二行字符串s
输出
对于每个样例,如果s不可能成为good,输出“-1”
否则第一行输出操作个数p
第二行输入插入“01”字符的位置,0表示插入s开头,其他数值i表示插入到第i个字符之后。
解析
依次对比字符串首位字符,如果不同,则去掉首位字符,查看得到的新字符串的首位。如果相同,两种情况,同为1,则要在开头添加“01”;同为“0”,则要在末尾添加“01”。依次判断保存添加结果即可,需注意插入操作对插入位置的影响,其他为模拟过程。
代码
from collections import dequedef solve():n = int(input().strip())q = deque(input().strip())cnt0 = cnt1 = 0for c in q:if c == "1":cnt1 += 1else:cnt0 += 1if cnt0 != cnt1:print("-1")returnres = list()d = 0while len(q) > 1:if q[0] == q[-1]:if q[0] == "0":q.append("0")q.append("1")res.append(n-d)else:q.appendleft("1")q.appendleft("0")res.append(d)n += 2while len(q) > 1 and q[0] != q[-1]:q.pop()q.popleft()d += 1print(len(res))for r in res:print(r, end=" ")print()K = int(input().strip())for k in range(K):solve()
尾
这次B提交错误两次,C未做完没提交,跟上次差不多。将原题目贴出来,B提交错误的两次是没理解对题目意思,英文的阅读理解还是有一定问题的。
比如
可以插入多次这种字眼会忽略掉,还有
开始以为1,101,0101是一个完整地数字,后来才发现这是三个例子1和101和0101,愁了半天。还是要慢慢读题目,然后看题目给的例子,最后有些题目末尾有作者写的note,一定要好好看,确认自己理解无误。不然提交错了,白白扣分。不用着急做后边的题,反正也不会,争取不提交错误就行。
CF灰407——>CF灰692