結果

問題 No.38 赤青白ブロック
ユーザー fantasiabaeticafantasiabaetica
提出日時 2018-10-15 16:06:35
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 218 ms / 5,000 ms
コード長 1,588 bytes
コンパイル時間 591 ms
コンパイル使用メモリ 65,408 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-12 18:31:15
合計ジャッジ時間 6,874 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 206 ms
5,248 KB
testcase_01 AC 172 ms
5,248 KB
testcase_02 AC 170 ms
5,248 KB
testcase_03 AC 184 ms
5,248 KB
testcase_04 AC 180 ms
5,248 KB
testcase_05 AC 218 ms
5,248 KB
testcase_06 AC 174 ms
5,248 KB
testcase_07 AC 177 ms
5,248 KB
testcase_08 AC 209 ms
5,248 KB
testcase_09 AC 188 ms
5,248 KB
testcase_10 AC 202 ms
5,248 KB
testcase_11 AC 194 ms
5,248 KB
testcase_12 AC 189 ms
5,248 KB
testcase_13 AC 205 ms
5,248 KB
testcase_14 AC 177 ms
5,248 KB
testcase_15 AC 208 ms
5,248 KB
testcase_16 AC 153 ms
5,248 KB
testcase_17 AC 178 ms
5,248 KB
testcase_18 AC 198 ms
5,248 KB
testcase_19 AC 184 ms
5,248 KB
testcase_20 AC 208 ms
5,248 KB
testcase_21 AC 173 ms
5,248 KB
testcase_22 AC 190 ms
5,248 KB
testcase_23 AC 197 ms
5,248 KB
testcase_24 AC 174 ms
5,248 KB
testcase_25 AC 190 ms
5,248 KB
testcase_26 AC 181 ms
5,248 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
using namespace std;
#define FOR(i,a,b) for(int i=(a); i<(b); i++)

bool check(string str, int kr, int kb){
    int size = str.size();
    FOR(i, 0, size){
        char str_i = str[i];
        if (str_i == 'R'){
            if (i - kr >= 0){
                if (str[i - kr] == 'R') return false;
            } else if (i + kr < size) {
                if (str[i + kr] == 'R') return false;
            }
        } else if (str_i == 'B') {
            if (i - kb >= 0){
                if (str[i - kb] == 'B') return false;
            } else if (i + kb < size) {
                if (str[i + kb] == 'B') return false;
            }
        }
    }
    return true;
}

int main(){
    int kr, kb;
    string str, str_tmp;
    cin >> kr >> kb;
    cin >> str;

    int ans = 0;
    int max_i = 1 << 20;
    // 一部を抜き出した文字列を生成してループを回す
    FOR(i, 0, max_i){
        // iはループのたびに右にシフトするので別の変数にコピー
        int i_tmp = i;
        str_tmp = "";
        // 文字列の生成
        FOR(j, 0, str.size()){
            char str_j = str[j];
            if (str_j != 'W') {
                if ((i_tmp & 1) == 1){
                    str_tmp += str_j;
                }
                i_tmp = i_tmp >> 1;
            } else {
                str_tmp += str_j;
            }
        }
        if (check(str_tmp, kr, kb)){
            if (str_tmp.size() > ans){
                ans = str_tmp.size();
            }
        }
    }
    cout << ans << endl;

    return 0;
}
0