jining第三天

思路:

首先每一个元素的转变是必须的,难点在于复制一个元素到最后一个元素需要多少操作数,如果

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值