Codeforces Global Round 14-A. Phoenix and Gold-暴力
Posted Chivas_/Regal
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 14-A. Phoenix and Gold-暴力相关的知识,希望对你有一定的参考价值。
题目:
思路:
每次由于我们放的重量不断累加,一旦超过x便安全了
我们从小到大放元素
如果下一个元素放进去会=x
我们就向后寻找有没有能让总重量跳过的
如果有就是放进去
如果没有输出NO
代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <map>
#include <queue>
#include <unordered_map>
#include <stack>
#include <string>
#include <vector>
#define IOS ios::sync_with_stdio(false)
#define rep1(i, a, n) for (int i = a; i <= n; i++)
#define rep2(i, a, n) for (int i = a; i >= n; i--)
#define each_cass(cass) for(cin >> cass; cass; cass--)
#define lowbit(x) (x&-x)
#define mm(a, b) memset(a, b, sizeof(a))
#define SP system("pause")
#define Chivas int main()
#define gcd(a,b) __gcd(a,b)
#define Regal return 0
typedef long long ll;
const int INF = 0x7FFFFFFF;
const double G = 10;
const double eps = 1e-6;
const double PI = acos(-1.0);
using namespace std;
inline void solve(){
int n, x;
cin >> n >> x;
int a[n + 10];
for(int i = 0; i < n; i ++) cin >> a[i];
sort(a, a + n);
int sum = 0;
map<int, int>mp;//存某个下标是否使用过
vector<int >ord;//存答案每个位置对应原数组的下标
for(int i=0 ; i < n; i ++){
if(mp[i]) continue;
if(sum + a[i] == x){//下一个位置=x了
int flag = false;//判断能不能找得到
for(int j = i; j < n; j ++){
if(sum + a[j] != x){
flag = true;
sum += a[j];
ord.push_back(j);
mp[j] = 1;
break;
}
}
if(!flag){
cout << "NO" << endl;
return;
}
}else{
sum += a[i];
ord.push_back(i);
mp[i] = 1;
}
}//把没用的元素加进去
for(int i = 0; i < n; i ++){
if(!mp[i]){
ord.push_back(i);
mp[i] = 1;
}
}
cout << "YES" << endl;
for(int i = 0; i < n; i ++) cout << a[ord[i]] << " ";
cout << endl;
}
Chivas{
IOS;
int cass;
each_cass(cass){
solve();
}
Regal;
}
以上是关于Codeforces Global Round 14-A. Phoenix and Gold-暴力的主要内容,如果未能解决你的问题,请参考以下文章