传送门: Problem - 1189B - Codeforces
考虑一段有序的序列 6 5 4 3 2 1,除了为首的元素以外,它们总是满足a[i]<=a[i-1]+a[i+1]
因此,序列是否能够构造的判断条件便是:序列中最大的元素需要小于等于第二大的元素和第三大的元素之和
构造思路:将最大的元素放置于中间,按照元素的大小顺序按一左一右的方式先后放置(不按一左一右的方式也行,需要保证序列从中间最大元素的位置向两边递减),最终构造出来的序列符合题目条件
#include<cstdio> #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; int n; int a[1000010]; int b[2000020]; int cmp(int a,int b) { return a>b; } int l,r,mid; int main(){ cin>>n; mid=(1+n)/2; l=mid-1; r=mid+1; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1,cmp); if(a[2]+a[3]<=a[1]) { cout<<"NO"<<endl; return 0; } cout<<"YES"<<endl; b[mid]=a[1]; b[l]=a[2]; b[r]=a[3]; for(int i=4;i<=n;i++) { if(i%2==0) { if(l==1) { r++; b[r]=a[i]; continue; } l--; b[l]=a[i]; } else if(i%2==1) { if(r==n) { l--; b[l]=a[i]; continue; } r++; b[r]=a[i]; } } for(int i=1;i<=n;i++)cout<<b[i]<<" "; return 0; }