原题传送器<----点我
**题意:**n个数字,请你给它们排个序围成一个环,满足任意一个数两边的数之和大于它本身,例如题目给的图(左图为正确答案),如果不存在这样的环就输出NO。
难度★
题解
这题主要靠思路,能想到正确的方法就很easy,码量不多。
对于这组数我们可以先排升序,然后取后三位比较~~(为什么,往下看)~~ ,例如后三位是a[n-2],a[n-1],a[n],然后比较a[n]>a[n-1]+a[n-2]是否成立,如果不成立就说明肯定不能成环,反手就是输出NO;如果成立,先将a[n]和a[n-1]输出,然后除了a[n-2]的其他数直接输出就行,把a[n-2]最后输出;
即a[n] a[n-1] a[1] a[2] …a[n-3]
因为我们排过序,所以a[1]到a[n-3]都是升序列,两边数之和绝对大于它本身(光右边的数就大于),然后因为我们特判过所以a[n]<a[n-1]+a[n-2],而且a[n]为最大数,a[n-1],a[n-2]都小于它,所以也满足,这样所有数都满足了。
其实感觉这题也就A题的难度,讲的有点啰嗦,大致能明白就行。
上代码
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int a[100003];
int main()
{int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n,less<int>());if(a[n]<(a[n-1]+a[n-2])){cout<<"YES"<<endl;cout<<a[n]<<" "<<a[n-1]<<" ";for(int i=n-3;i>=1;i--){printf("%d ",a[i]);}cout<<a[n-2];}else cout<<"NO";return 0;
}
写完题解,睡觉
0:35