結果

問題 No.15 カタログショッピング
ユーザー yuppe19 😺yuppe19 😺
提出日時 2017-07-01 14:56:09
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 25 ms / 5,000 ms
コード長 1,401 bytes
コンパイル時間 1,206 ms
コンパイル使用メモリ 79,288 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-04-15 10:03:40
合計ジャッジ時間 1,910 ms
ジャッジサーバーID
(参考情報)
judge3 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
6,816 KB
testcase_01 AC 2 ms
6,940 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 AC 2 ms
6,944 KB
testcase_04 AC 2 ms
6,944 KB
testcase_05 AC 22 ms
6,940 KB
testcase_06 AC 23 ms
6,944 KB
testcase_07 AC 25 ms
6,940 KB
testcase_08 AC 22 ms
6,944 KB
testcase_09 AC 23 ms
6,940 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]); }
      |                            ~~~~~^~~~~~~~~~~~~

ソースコード

diff #

#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;
}
0