TopCoder SRM600: ORSolitaire
goal の使っている各bitについて、その bit を立てられないように、numbers から削除すればよい。ただしこのとき numbers のうち、goal が使っていない bit を含むものは無視する。
public class ORSolitaire { public int getMinimum(int[] numbers, int goal) { int ans = int.MaxValue; for (int i = 0; i < 30; i++) { if ((goal & (1L << i)) == 0) continue; int cnt = 0; foreach (var x in numbers) { if ((goal | x) != goal) continue; if (((1L << i) & x) != 0) { cnt++; } } ans = Math.Min(ans, cnt); } return ans; } }