C♯の勉強

C♯4.0 で TopCoder の過去問を解きます。

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;
    }
}