結果
問題 | No.15 カタログショッピング |
ユーザー | yuppe19 😺 |
提出日時 | 2017-07-01 14:56:09 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 20 ms / 5,000 ms |
コード長 | 1,401 bytes |
コンパイル時間 | 821 ms |
コンパイル使用メモリ | 79,220 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-10-05 03:41:53 |
合計ジャッジ時間 | 1,477 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,816 KB |
testcase_01 | AC | 2 ms
6,816 KB |
testcase_02 | AC | 1 ms
6,816 KB |
testcase_03 | AC | 2 ms
6,816 KB |
testcase_04 | AC | 1 ms
6,820 KB |
testcase_05 | AC | 18 ms
6,820 KB |
testcase_06 | AC | 20 ms
6,816 KB |
testcase_07 | AC | 20 ms
6,820 KB |
testcase_08 | AC | 20 ms
6,816 KB |
testcase_09 | AC | 20 ms
6,816 KB |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:7:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 7 | int N, S; scanf("%d%d", &N, &S); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:9:33: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 9 | for(int i=0; i<N; ++i) { scanf("%d", &P[i]); } | ~~~~~^~~~~~~~~~~~~
ソースコード
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(void) { int N, S; scanf("%d%d", &N, &S); vector<int> P(N); // P[N] for(int i=0; i<N; ++i) { scanf("%d", &P[i]); } // 前半 n 個、後半 m 個の 全 N 個 int n = N / 2; int m = N - n; vector<pair<int, int>> memo; for(int mask=0; mask<1<<m; ++mask) { int acc = 0; for(int i=0; i<m; ++i) { if(mask >> i & 1) { acc += P[i+n]; } } memo.emplace_back(acc, mask); } sort(begin(memo), end(memo)); int M = memo.size(); vector<vector<int>> res; for(int mask=0; mask<1<<n; ++mask) { int acc = S; vector<int> v; for(int i=0; i<n; ++i) { if(mask >> i & 1) { v.push_back(i); acc -= P[i]; } } int lo = 0, hi = M; // [lo, hi) while(hi - lo > 1) { int md = (lo + hi) / 2; (memo[md].first < acc ? lo : hi) = md; } for(int x=lo; x<M; ++x) { if(memo[x].first > acc) { break; } if(memo[x].first < acc) { continue; } vector<int> w = v; int S = memo[x].second; for(int i=0; i<m; ++i) { if(S >> i & 1) { w.push_back(i+n); } } res.push_back(w); } } sort(begin(res), end(res)); for(vector<int> row : res) { for(int i=0, z=row.size(); i<z; ++i) { if(i) { putchar(' '); } printf("%d", row[i]+1); } putchar('\n'); } return 0; }