题目链接:点击这里
先对数组从小到大排序,只需要判断最后三个数就行,只有最后一个小于,倒数第二个加上倒数倒数第三个就行,把倒数第一个放到第一位,倒数第二个放到第二位,倒数第三个放到最后一位,这样他们三个的位置就是合法的,然后把其余数字倒序输出,因为,先输出的壁厚输出的大,所以顺序一定合法。
AC代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int i,j,k;
int a[100010];
int cnt1;
int cnt2;
int main()
{
int n,m,q;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
if(a[n]<a[n-1]+a[n-2])
{
printf("YES\n");
printf("%d %d ",a[n],a[n-1]);
for(i=n-3;i>0;i--)
{
printf("%d ",a[i]);
}
printf("%d\n",a[n-2]);
}
else
printf("NO\n");
return 0;
}