小易有一个长度为n的数字数组, , …, 。
问你是否能用这n个数字构成一个环(首尾连接),使得环中的每一个数字都小于它相邻的两个数字的和(每个数字都必须使用并且每个数字只能使用一次)。
第一行包含一个整数t(1<=t<=10),表示测试用例的组数。
每个测试用例输入如下:
第一行一个整数n,表示数字的个数;
第二行n个整数, , …, ,每两个整数之间用一个空格分隔。
输入数据保证
。
输出应该包含t行,对于每组用例,若能输出"YES",否则输出"NO"。
1 5 17 6 17 11 17
YES
1 3 1 2 4
NO
#include <iostream> using namespace std; int main() { int t ; cin >> t; while(t>0) { long long n ; cin >> n; if(n<=2) cout << "NO" << endl; else { long long a[n]; for(long long i =0;i<n;i++) cin >> a[i]; //直接找最大值 次最大值 次次最大值 long long max = a[0]; long long ccmax = 0; long long cmax = 0; for(long long i=1;i<n;i++) { if(a[i]>=max) { ccmax = cmax; cmax = max; max = a[i]; } else if (a[i] >= cmax) { ccmax = cmax; cmax = a[i]; } else if (a[i] >= ccmax) { ccmax = a[i]; } } if(ccmax+cmax>max) //最大值小于后两个之和 则所有都满足条件 cout << "YES" << endl; else cout << "NO" << endl; } t--; } }
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); int t = cin.nextInt(); while (t-- != 0) { int n = cin.nextInt(); long[] a = new long[n]; for (int i = 0; i < n; i++) { a[i] = cin.nextLong(); } Arrays.sort(a); if (a[n-2] + a[n-3] > a[n-1]){ //只要只要最后二个和第一个加起来大于最后一个 //可以考虑将最后一个往前交换一位,这样都能满足条件 System.out.println("YES"); }else { System.out.println("NO"); } } } }
t = int(input()) while t: n = int(input()) arr = list(map(int, input().strip().split())) arr.sort() arr[-1], arr[-2] = arr[-2], arr[-1] for i in range(n): pre, pos = (i - 1 + n) % n, (i + 1) % n # 前一个数和后一个数的索引 if arr[i] >= arr[pre] + arr[pos]: # 相邻数的和大于等于中间的数,不符合要求 print("NO") break else: # 循环正常执行完了才会走else,如果中途退出了不会执行 print("YES") t -= 1
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while ( t-- != 0){ int n = sc.nextInt(); long[] a = new long[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextLong(); } System.out.println(solution(a)); } } public static String solution(long arr[]){ Arrays.sort(arr); if (arr[arr.length-1] < arr[0] + arr[arr.length-2]) { return "YES"; }else { swap(arr,arr.length-1,arr.length-2); if (arr[arr.length - 2] < arr[arr.length - 3] + arr[arr.length-1]){ return "YES"; }else { return "NO"; } } } private static void swap(long[] arr, int i, int i1) { arr[i] = arr[i1] ^ arr[i]; arr[i1] = arr[i] ^ arr[i1]; arr[i] = arr[i] ^ arr[i1]; } }
t = int(input()) for _ in range(t): n = int(input()) a = list(map(int, input().split())) a.sort() a[-1], a[-2] = a[-2], a[-1] for i in range(n): pre, pos = (i - 1)%n, (i + 1) % n if a[i] >= a[pre] + a[pos]: print("NO") break else: print("YES")
t = int(input()) while t: n = int(input()) data = list(map(int, input().split())) data.sort() data[-1], data[-2] = data[-2], data[-1] for i in range(n): pre, pos = (i - 1 + n)%n, (i + 1) % n if data[i] >= data[pre] + data[pos]: print("NO") break else: print("YES") t -= 1
t = int(input()) for i in range(t): n = int(input()) a = list(map(int, input().split())) c1, c2, c3 = float('-inf'), float('-inf'), float('-inf') for num in a: if num>c1: c3 = c2 c2 = c1 c1 = num elif num>c2: c3 = c2 c2 = num elif num>c3: c3 = num if c3+c2<c1: print('NO') else: print('YES')
#include<iostream> #include<algorithm> using namespace std; int main() { int t; cin >> t; while (t>0) { int n; cin >> n; long long* a; a = new long long[n]; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n); long long max = a[n - 1]; long long cmax = a[n - 2]; long long ccmax = a[n - 3]; if (ccmax + cmax > max) cout << "YES" << endl; else cout << "NO" << endl; delete[]a; a = NULL; t--; } }本地编译器VS不支持变长数组int a[n],用new在堆区,可以
import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int i = 0;i < T;i++){ int n = sc.nextInt(); long[] arr = new long[n]; boolean flag = true; for(int j = 0;j < n;j++){ arr[j] = sc.nextLong(); } if(arr[0] != arr[arr.length - 1]){ System.out.println("NO"); continue; } for(int k = 1;k < arr.length - 1;k++){ if((arr[k - 1] + arr[k + 1]) < arr[k]){ flag = false; } } if(flag){ System.out.println("YES"); }else { System.out.println("NO"); } } } }case 30%
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int t = sc.nextInt(); while(t > 0){ t--; long length = sc.nextInt(); LinkedList<Long> nums = new LinkedList<>(); while(length > 0){ nums.add(sc.nextLong()); length--; } String s = method(nums)? "YES":"NO"; System.out.println(s); } } public static boolean method(LinkedList<Long> nums){ if(nums == null || nums.size() <= 2){ return false; } Collections.sort(nums); long a1 = nums.removeLast(); long a2 = nums.removeLast(); long a3 = nums.removeLast(); return a1 < a2 + a3; } }
import java.util.Scanner; public class Main{ public static void main(String[] args){ Scanner sc= new Scanner(System.in); int t=sc.nextInt(); int n= sc.nextInt(); long[][] martix=new long[t][ n]; for(int i=0;i<t;i++){ for(int j=0;j<n;j++){ martix[i][j]=sc.nextLong();//读取要用long,长整型 } } long[] count= new long[t]; for(int i=0;i<t;i++) {//判断第一个数和最后一个数 if (martix[i][0] > martix[i][1] + martix[i][n - 1]) { count[i]++; } if(martix[i][n - 1] > martix[i][n - 2] + martix[i][0]){ count[i]++; } for (int j = 1; j < n - 1; j++) { if (martix[i][j] > martix[i][j - 1] + martix[i][j + 1]) { count[i]++; } } } for (int i=0;i<t;i++){ if (count[i]==0){ System.out.println("YES"); }else { System.out.println("NO"); } } } }
case20%,提示数组越界等非法访问情况
import java.util.*; import java.io.*; public class Main{ public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); for(int i = 0;i < t;i++){ int n = Integer.parseInt(br.readLine()); String[] str = br.readLine().split(" "); long[] arr = new long[n]; for(int j = 0;j < n;j++){ arr[j] = Long.parseLong(str[j]); } if(isCircle(arr,n)) System.out.println("YES"); else System.out.println("NO"); } } public static boolean isCircle(long[] arr,int n){ Arrays.sort(arr); if(arr[0] + arr[n-2] > arr[n-1]) return true; else if((arr[0] + arr[n-1] > arr[n-2]) && (arr[n-2] + arr[n-3] > arr[n-1])) return true; return false; } }数组要用long
def y_n(t): for j in range(t): n = int(input()) x = list(map(int, input().split(' '))) Y_N = 'YES' #x = X[j] y = x[0:1] for i in range(2,n): if x[i] < (x[i-1]+x[i-2]): # 小于两数和插入中间,大于等于则加在后面 y.insert(i-1, x[i]) else: y.append(x[i]) if (y[0]+y[-2]) < y[-1]: Y_N='NO' print(Y_N) t = int(input()) #n = int(input()) #X = list(map(int, input().split(' '))) # a=int(n/m) # X=[X[i:i+a] for i in range(0, n, a)] # 将数据分成m组,存入listX #X=[X[i:i+n] for i in range(0, len(X), n)] # 将数据分成m组,存入listX # print(X) y_n(t)
case20%,提示数组越界等非法访问情况
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); while(n>0){ int m=in.nextInt(); int [] a=new int[m]; for(int i=0;i<m;i++){ a[i]=in.nextInt(); } CountingSort(a); int k=a[m-1]; a[m-1]=a[m-2]; a[m-2]=k; int flag=1; for(int i=0;i<m-2;i++){ if(a[i]+a[i+2]<a[i+1]){ flag=0; } } if(flag==1){ System.out.println("YES"); }else{ System.out.println("NO"); } n--; } } public static int[] CountingSort(int[] array) { if (array.length == 0) { return array; } int bias, min = array[0], max = array[0]; for (int i = 1; i < array.length; i++) { if (array[i] > max){ max = array[i]; } if (array[i] < min){ min = array[i]; } } bias = 0 - min; int[] bucket = new int[max - min + 1]; Arrays.fill(bucket, 0); for (int i = 0; i < array.length; i++) { bucket[array[i] + bias]++; } int index = 0, i = 0; while (index < array.length) { if (bucket[i] != 0) { array[index] = i - bias; bucket[i]--; index++; } else{ i++; } } return array; } }