数字圆环

小易有一个长度为n的数字数组a1, a2, …, an

问你是否能用这n个数字构成一个环(首尾连接),使得环中的每一个数字都小于它相邻的两个数字的和(每个数字都必须使用并且每个数字只能使用一次)。

输入描述:
第一行包含一个整数t(1<=t<=10),表示测试用例的组数。
每个测试用例输入如下:
第一行一个整数n,表示数字的个数;
第二行n个整数a1, a2, …, an,每两个整数之间用一个空格分隔。
输入数据保证 3<=n<=105, 1<=ai<=109

输出描述:
输出应该包含t行,对于每组用例,若能输出"YES",否则输出"NO"。

输入例子1:
1
5
17 6 17 11 17

输出例子1:
YES

输入例子2:
1
3
1 2 4

输出例子2:
NO

 

参考1:

思路:由大到小排列,依次放入一个新的列表里,注意摆放顺序,需符合环的特性。

m = int(input())
for _ in range(m):
    n = int(input())
    num = map(int,input().split())
    num = sorted(num, reverse = True)  #降序排列
    res = [0]*(n+2)
    for i in range(n):
        if i == 0:
            res[1] = num[i]
            res[n+1] = num[i]
        elif i == 2:
            res[0] = num[i]
            res[n] = num[i]  
        elif i == 1:
            res[2] = num[i]
        else:
            res[i] = num[i]
    k = 0
    for j in range(1,n+1):      #再逐步核对是否符合
        if res[j] >= res[j-1] + res[j+1]:
            print("NO",end = "\n")
            break
        else:
            k = k + 1
    if k == n:
        print("YES",end = "\n")

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

 

参考2:

思路:先把数组由小到大排序,然后只要确定最大的数在第二大数与第三大的数的和之间,就满足条件

m = int(input())
for _ in range(m):
    n = int(input())
    num = map(int,input().split())
    num = sorted(num)  #升序排列
    if num[-1] < num[-3] + num[-2]:
        print("YES",end = "\n")
    else:
        print("NO",end = "\n")

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

posted @ 2020-08-07 23:08  Andy_George  阅读(325)  评论(0编辑  收藏  举报