思路:
首先每一个元素的转变是必须的,难点在于复制一个元素到最后一个元素需要多少操作数,如果
a[j] <= b[-1] and b[j] >= b[-1] or a[j] >= b[-1] and b[j] <= b[-1]
则只需要移动就可以,因为a[j]元素在变成b[j]元素的时候会变为b列表最后一个数,如果没有的话,那就循环计算
min(abs(b[-1] - a[j]),abs(b[-1] - b[j]))
记录转变最小的操作数,最最后加一
代码:
t = int(input())
for i in range(t):
n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
q = 0
min_q = 1e10
e = ''
flag = 0
list1 = [0] * (len(a))
for j in range(len(a)):
list1[j] = abs(b[j] - a[j])
if a[j] <= b[-1] and b[j] >= b[-1] or a[j] >= b[-1] and b[j] <= b[-1]:
flag = 1
q = min(abs(b[-1] - a[j]),abs(b[-1] - b[j]))
if q < min_q:
min_q = q
e = j
if flag == 1:
print(sum(list1) + 1)
else:
print(sum(list1) + min_q + 1)
思路:
在找到1开始,用字典统计1的个数,之后遇到0则加上dict["1"]再加1,因为这样可以保证每次遇到1之后的0可以第一时间循环移位,保证了操作的最小值。
代码:
t = int(input())
for i in range(t):
n = input()
dict1 = {'1':0}
count1 = 0
flag = 0
for i in range(len(n)):
if n[i] == '1':
dict1['1'] += 1
flag = 1
if flag == 1 and n[i] == '0':
count1 += dict1['1'] + 1
print(count1)
思路:
因为输入一定是可以变成"美丽"数组,-1的情况是里面每一个元素都相等,另一种情况比如AQAQAAAAQAQA,我们要把Q连接,所以遍历一遍看最少删除几个A可以实现,代码很精巧。
代码:
t = int(input())
for _ in range(t):
n = int(input())
a = list(map(int, input().split()))
lst = -1
ans = n
for i in range(n):
if a[i] != a[0]:
ans = min(ans, i - lst - 1)
lst = i
ans = min(ans, n - lst - 1)
if ans == n:
print(-1)
else:
print(ans)