結果

問題 No.74 貯金箱の退屈
ユーザー hitoyozakehitoyozake
提出日時 2018-08-06 16:37:29
言語 C++11
(gcc 11.4.0)
結果
RE  
実行時間 -
コード長 2,198 bytes
コンパイル時間 1,143 ms
コンパイル使用メモリ 78,920 KB
実行使用メモリ 85,864 KB
最終ジャッジ日時 2024-09-19 18:15:38
合計ジャッジ時間 12,289 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,816 KB
testcase_01 RE -
testcase_02 RE -
testcase_03 RE -
testcase_04 RE -
testcase_05 RE -
testcase_06 RE -
testcase_07 RE -
testcase_08 RE -
testcase_09 RE -
testcase_10 RE -
testcase_11 RE -
testcase_12 RE -
testcase_13 RE -
testcase_14 RE -
testcase_15 RE -
testcase_16 RE -
testcase_17 RE -
testcase_18 RE -
testcase_19 RE -
testcase_20 RE -
testcase_21 RE -
testcase_22 RE -
testcase_23 RE -
testcase_24 RE -
testcase_25 RE -
testcase_26 RE -
testcase_27 RE -
testcase_28 RE -
testcase_29 RE -
testcase_30 RE -
testcase_31 TLE -
testcase_32 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
#include <set>
#include <queue>
#include <vector>

void print_state(std::vector<int> const & s){
    //std::cout << "print: " << std::endl;
    for( int i = 0; i < s.size()-1; ++i){
        std::cout << s[i] << ",";
    }

    std::cout << s.back() << std::endl;
}

int main()
{
    int n = 0;
    std::cin >> n;
    std::vector<int> coins;
    std::vector<int> init_state(n, 0);
    for( int i = 0; i < n; ++i )
    {
        int in = 0;
        std::cin >> in;
        coins.push_back(in);
    }

    for( int i = 0; i < n; ++i )
    {
        int in = 0;
        std::cin >> in;
        init_state[i] = in==1;
    }

    std::queue<std::vector<int>> states_q;

    std::set<std::vector<int>> states;
    states_q.push(init_state);
    
    bool found = false;
    int counter = 0;
    while(!states_q.empty()){
        std::vector<int> const s = states_q.front();
        int t = 1;
        for(int i = 0; i < n; ++i )
        {
            t *= s[i];
        }

        if(t==1)
        {
            found=true;
            //states_q.clear();
            break;
        }
        
        auto const r = states.insert(s);
    
        states_q.pop();
        if(r.second){
            //知って�?る盤面ではなかっ�?
            //�?番に盤面を生成してqueueに追�?する
            
            for(int i = 0; i < n; ++i)
            {
                int const plus = 0+coins[i]%n;
                int const minus = n+(0-coins[i])%n-1;
                //std::cout << "plus:" << plus %n << std::endl;
                //std::cout << "minus:" << minus %n << std::endl;
                //std::vector<int> s_copy = s;
                std::vector<int> s_copy = s;
                s_copy[(0 + coins[i])%n] = (int)!(s_copy[plus%n] == 1);
                s_copy[(0 - coins[i])%n] = (int)!(s_copy[minus%n] == 1);
                //print_state(s_copy);
                
                states_q.push(s_copy);
                
            }
        }
        else
        {
            continue;
        }
    }

    if(found)
        std::cout << "Yes" << std::endl;
    else
        std::cout << "No" << std::endl;

    return 0;
}





0