結果
問題 | No.332 数列をプレゼントに |
ユーザー |
|
提出日時 | 2017-09-23 16:46:09 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 68 ms / 2,000 ms |
コード長 | 2,086 bytes |
コンパイル時間 | 1,234 ms |
コンパイル使用メモリ | 112,492 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-12-24 10:46:09 |
合計ジャッジ時間 | 2,921 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 42 |
ソースコード
#define _USE_MATH_DEFINES#include <cstdio>#include <iostream>#include <sstream>#include <fstream>#include <iomanip>#include <algorithm>#include <cmath>#include <complex>#include <string>#include <vector>#include <list>#include <queue>#include <stack>#include <set>#include <map>#include <bitset>#include <numeric>#include <limits>#include <climits>#include <cfloat>#include <functional>#include <iterator>using namespace std;bool solve(const vector<int>& a, int x, vector<bool>& ans){int n = a.size();vector<int> dp(x+1, -1);dp[0] = 0;for(int i=0; i<n; ++i){for(int j=x; j>=a[i]; --j){if(dp[j] == -1 && dp[j-a[i]] != -1)dp[j] = i;}}if(dp[x] == -1)return false;ans.assign(n, false);int i = x;while(i != 0){ans[dp[i]] = true;i -= a[dp[i]];}return true;}int main(){int n;long long x;cin >> n >> x;vector<int> a, b;vector<int> aIndex, bIndex;for(int i=0; i<n; ++i){int c;cin >> c;if(c < 20000){a.push_back(c);aIndex.push_back(i);}else{b.push_back(c);bIndex.push_back(i);}}int aSum = accumulate(a.begin(), a.end(), 0);int m = b.size();for(int i=0; i<(1<<m); ++i){bitset<32> bs(i);long long y = x;for(int j=0; j<m; ++j){if(bs[j])y -= b[j];}if(0 <= y && y <= aSum){vector<bool> used;if(solve(a, (int)y, used)){string ans(n, 'x');for(int j=0; j<m; ++j){if(bs[j])ans[bIndex[j]] = 'o';}for(unsigned j=0; j<used.size(); ++j){if(used[j])ans[aIndex[j]] = 'o';}cout << ans << endl;return 0;}}}cout << "No" << endl;return 0;}