
一个元素全为整数的数组,如果满足相邻两个元素和相同,我们就认定此数组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 - odd
- if abs(odd - even) <= 1:
- print("YES")
- else:
- print("NO")
- else:#奇偶位数字相同
- print("YES")

一个字符串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 = 1
- for c in s:
- if c == l:
- return False
- else:
- l = c
- return True
-
- for 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")

字符串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 deque
-
- def solve():
- n = int(input().strip())
- q = deque(input().strip())
-
- cnt0 = cnt1 = 0
- for c in q:
- if c == "1":
- cnt1 += 1
- else:
- cnt0 += 1
-
- if cnt0 != cnt1:
- print("-1")
- return
-
- res = list()
- d = 0
-
- while 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 += 2
-
- while len(q) > 1 and q[0] != q[-1]:
- q.pop()
- q.popleft()
- d += 1
-
- print(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