ORSolitaire - TopCoder SRM Div1 #600 Easy
これは解ける.223.84pt(Practice)
解法
まず,各整数がgoalをつくるのに使えるかを調べる.
整数nがn | ~goal = 0を満たすならば,nはgoalをつくるのに使える.
(等式を満たさないならば,goalにない1の立つビットができてしまう.)
満たす整数のORをとり,goalにならなければ,そもそもできないので,0を出力する.
そうでなければ,goalの1であるビットに着目する.そのビットが1である整数をすべて削除すれば,goalをつくることはできない.よって,各ビットに対し,そこが1である整数を数えて,その最小の個数を求めればいい.
コード
class ORSolitaire { public: int getMinimum(vector<int> numbers, int goal) { int x = 0; std::vector<int> v; for(int n : numbers){ if(n & ~goal){continue;} x |= n; v.push_back(n); } if(x != goal){return 0;} int res = 252521; for(int i=0;i<=30;i++){ if(!(goal >> i & 1)){continue;} int c = 0; for(int j : v){ if(j >> i & 1){++c;} } res = std::min(res, c); } return res; } };