A. Phoenix and Gold

前言:我是菜鸡,写这题被自己的脑洞折磨,写成dp,dfs,差点没写出来。


A. Phoenix and Gold
  题目类型:构造,模拟。
  解析:题目中重要信息:数组中每个数都不一样,那么直接模拟,从1取到n,如果发现到i时,前缀和pre[i]=x,那么把i和没取过的换一下就行了,因为每个数都不一样,所以换完之后pre一定不等于x,如果等于,说明数组总和=x,输出no。
  code

#include <iostream>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define min_(a,b) a<b?a:b
#define max_(a,b) a>b?a:b
using namespace std;
 
int t,n,x,sum,flag,a[101010];
 
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin >> t ;
    while(t--){
    
    
        cin >> n >> x;
        sum = 0;
        int flag = 1;
        for(int i = 1 ; i <= n ; ++i)
            cin >> a[i] ;
        for(int i = 1 ; i <= n ; ++i){
    
    
            sum += a[i] ;
            if(sum == x){
    
    
                sum += a[n] - a[i];
                swap(a[i] , a[n]);
                if(sum == x){
    
    
                    flag = 0;
                    break;
                }
            }
        }
        if(flag){
    
    
            cout << "YES" << endl ;
            for(int i = 1 ; i <= n ; ++i)
                cout << a[i] << " ";
            cout << endl ;
        }
        else
            cout << "NO" << endl ;
    }
    cout << "不要完全抄哦" << endl ;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_45699242/article/details/116381930