A. Phoenix and Gold
Example
input
3
3 2
3 2 1
5 3
1 2 3 4 8
1 5
5
output
YES
3 2 1
YES
8 1 2 3 4
NO
题目大意:
一个n个元素的数组,从前往后加每一个元素,任意时刻都不能让和等于x。
思路:
1.sum==x时
只要数组总和等于x,无论怎么排序,一定不能满足要求,此时输出NO。其他情况总可以排序成满足。
2.sum<x时
怎么排序都可以。
3.sum>x时
降序排序,把元素相加,如果中间加的时候刚好等于x,那么让当前元素与下一个元素交换就行了(因为每个金条的重量都不同,所以交换之后肯定符合)(因为此时sum==x,所以一定有下一个元素)。
这题想通了做起来比较简单,但是一开始做的时候是真的难想,哎,wa了几发之后才做出了。
代码:
#include<algorithm>
#include<iostream>
#include<cmath>
#define AC 0
#define endl '\n'
#define PI acos(-1)
#define Please return
#define int long long
using namespace std;
const int N=1e5+7;
int a[N];
signed main()
{
fastio();
int t;
cin>>t;
while(t--)
{
int n,x;
int sum=0;
cin>>n>>x;
for(int i=0;i<n;++i)
{
cin>>a[i];
sum+=a[i];
}
if(sum==x)cout<<"NO"<<endl;
else
{
sort(a,a+n,greater<int>());
cout<<"YES"<<endl;
int num=0;
for(int i=0;i<n;++i)
{
num+=a[i];
if(num==x)
{
swap(a[i],a[i+1]);
break;
}
}
for(int i=0;i<n;++i)
{
cout<<a[i]<<' ';
}
cout<<endl;
}
}
Please AC;
}