C♯の勉強

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

TopCoder SRM622: BoxesDiv2

一番小さな箱を2つ選んで、一段階サイズが大きいの箱に入れる。これを箱が1つだけになるまで繰り返す。

public class BoxesDiv2 {
    int ToPower2(int x) {
        for (int i = 0; i <= 20; i++) {
            if (x <= (1 << i))
                return i;
        }
        return -1;
    }

    public int findSize(int[] candyCounts) {
        var candies = candyCounts.Select(ToPower2).ToList();
        while (candies.Count() > 1) {
            candies.Sort();
            candies.Add(Math.Max(candies[0], candies[1]) + 1);
            candies.RemoveAt(0);
            candies.RemoveAt(0);
        }
        return 1 << candies.Single();
    }
}