网易编程题 重排序列 python

14 篇文章 0 订阅
13 篇文章 0 订阅

重排序列(python)

小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]…, A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

输入描述:

输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)

输出描述:

对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。

代码:

## 这道题根据数列中4的个数可分为两种情况
## 1. 当4倍数m4的个数>=(数列长度L/2)时,
##    即m4的个数大于1半时肯定满足条件
##    因为一个m4,周围能放两个非m4,2个m4能放3个非m4,以此类推故满足
## 2. 当L_m4=num(m4)<L/2时,l_m4最多能保证L_m4个非m4与之
##    组合能够满足条件,剩余的数字个数为L-2*l_m4,
##    因为2*2=4,2个m2才是4的倍数,m2必须彼此相连才行
##    所以m2的个数大于等于L-2*L_m4时才满足条件
list_n = int(input())
list_set = []
for i in range(list_n):
    l_n= int(input())  #数列个数
    list_input = input().split(' ') #数列输入
    list_n = [int(list_input[i]) for i in range(l_n)]
    list_set .append(list_n)
for j in range(list_n):
    m0 = 0
    m2= 0
    m4= 0
    for i in range(len(list_set[j])) :
        if list_set[j][i] % 4 == 0 :
            m4 += 1
        elif list_set[j][i] % 2 == 0:
            m2+= 1
        elif list_set[j][i] % 2 != 0:
            m0+= 1
        else:
            continue
    if len(list_set[j]) == 1:
        print('Yes')
    elif m4>=(len(list_set[j])//2) or m2>=(len(list_set[j])-2*m4):
        print('Yes')
    else:
        print('No')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值