結果

問題 No.3 ビットすごろく
ユーザー abinull
提出日時 2025-06-24 17:14:58
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,238 bytes
コンパイル時間 788 ms
コンパイル使用メモリ 84,132 KB
実行使用メモリ 7,848 KB
最終ジャッジ日時 2025-06-24 17:15:00
合計ジャッジ時間 2,100 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 8 WA * 25
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <bitset>
#include <vector>
#include <queue>
#include <utility>

using namespace std;

int main() {

  int n;
  unsigned int t;
  
  cin >> n;

  vector<int> sg(n);
  vector<bool> v(n, false);

  for (int i=0; i<n; i++) {
    t = i+1;
    sg[i] = __popcount(t);
    //sg[i] = __popcnt(t);
  }

  queue<int> q;

  int i, current, prev, next, m, cnt;
  
  cnt = 0;
  current = 0; prev = 0; next = 0;
  while (next<=v.size()-1) {
    prev = current;
    current = next;
    v[current] = true;
      cnt++;
      next = current + sg[current];
  }

  if (current==v.size()-1) {
    cout << cnt << endl;
    return 0; 
  }
  
  q.push(prev);
  
  while (!q.empty()) {
    
      current = q.front(); q.pop();
      
      if (v[current]==false) {
        v[current] = true;
        cnt++;   
      }
      
      if (v[v.size()-1]==true) break;

    m = sg[current];

    for (i=(m%2==0 ? current : current+1); i<=current+m; i+=2) {
      if (i<0) continue;
      if (i>=v.size()) break;
      if (v[i]==true) continue;
      q.push(i);
    }
  } 

 if (current != v.size()-1) {cout << -1 << endl;}
 else {cout << cnt << endl;}

  return 0;
}

0