bit判定のみ


B - 価格の合計(diff: 604)

https://atcoder.jp/contests/abc014/tasks/abc014_2

int sum = 0;
// n個の商品について
for(int i = 0; i < n; i++){
		// bit xのi桁目は1かどうか -> bit xにi個目の商品は含んでいるか 
		if((x >> i) & 1) sum += a[i];
}

cout << sum << endl;

Bit全探索(N: 定数)


C - Train Ticket(diff: 337)

https://atcoder.jp/contests/abc079/tasks/abc079_c

方針

一番簡単な $2^N$ のNが定数のBit全探索。op1,op2,op3の状態は+-の2通りなので、全パターンは $2^3 = 8$通り。折角なのでBit全探索で探索する。

解答

// opの+/-についてbit全探索
// bit: opの+/-の集合を表す
for(int bit = 0; bit < (1 << 3); bit++){
    vector<char> op(3);
    for(int i = 0; i < 3; i++){
				// bitのi桁目は1かどうか -> bitのopのi番目は+か         
				if((bit >> i) & 1){
            op[i] = '+'; // 1なら+
        }else{
            op[i] = '-'; // 0なら-
        }
    }

    int calc = s[0] - '0'; // calcに予めs[0]を入れる
    for(int i = 0; i < 3; i++){
        if(op[i] == '+'){
            calc += (s[i + 1] - '0');
        }else{
            calc -= (s[i + 1] - '0');
        }
    }

    if(calc == 7){
            cout << s[0] << op[0] << s[1] << op[1] <<  s[2] << op[2] << s[3] << "=7" << endl;
            return 0;
    }
}

Bit全探索


C - Switches(diff: 805)

https://atcoder.jp/contests/abc128/tasks/abc128_c