結果
| 問題 | No.15 カタログショッピング |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-10-16 13:52:24 |
| 言語 | C++23(gcc16) (gcc 16.2.0 + boost 1.92.0 + ACL) |
| 結果 |
AC
不安定
|
| 実行時間 | 61 ms / 5,000 ms |
| + 693µs | |
| コード長 | 1,589 bytes |
| 記録 | |
| コンパイル時間 | 4,047 ms |
| コンパイル使用メモリ | 209,960 KB |
| 実行使用メモリ | 14,464 KB |
| 最終ジャッジ日時 | 2026-10-16 13:52:44 |
| 合計ジャッジ時間 | 5,781 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge5_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 12 |
ソースコード
#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
int main() {
using namespace std;
int n, s, m;
cin >> n >> s;
m = n / 2;
vector<int> p1(m), p2(n - m);
for (auto &e : p1) { cin >> e; }
for (auto &e : p2) { cin >> e; }
map<int, vector<int>> mp1, mp2;
for (int bit = 0; bit < (1 << m); bit++) {
int buy = 0, price = 0;
for (int i = 0; i < m; i++) {
if (bit >> i & 1) {
buy |= 1 << i;
price += p1[i];
}
}
mp1[price].push_back(buy);
}
for (int bit = 0; bit < (1 << (n - m)); bit++) {
int buy = 0, price = 0;
for (int i = 0; i < (n - m); i++) {
if (bit >> i & 1) {
buy |= 1 << i;
price += p2[i];
}
}
mp2[price].push_back(buy);
}
vector<vector<int>> ans;
for (auto [price, vec] : mp1) {
if (!mp2.contains(s - price)) { continue; }
for (int buy1 : vec) {
vector<int> a1;
for (int i = 0; i < m; i++) {
if (buy1 >> i & 1) { a1.push_back(i + 1); }
}
for (int buy2 : mp2[s - price]) {
vector<int> a2 = a1;
for (int i = 0; i < (n - m); i++) {
if (buy2 >> i & 1) { a2.push_back(i + m + 1); }
}
ans.push_back(a2);
}
}
}
sort(ans.begin(), ans.end());
for (auto a : ans) {
for (int e : a) { cout << e << " "; }
cout << "\n";
}
}