夢追い人

"It takes a dreamer to make a dream come true."―Vincent Willem van Gogh

SRM507復習と180

TopCoderのレートは711->724でした。

最終順位が終了直後の順位より上がっていた(500は見事に落ちていたのに…)のは結構500が見かけによらず注意すべき条件が多すぎたせいもあるのでしょうか・・・

復習

なんとなくC#を使いたくなって、なんとなくVisual Studio 2010 C#を使いたくなって、C#で復習しました。

まずMediumは他の人のコードを一応覚えていたのであとは実装のみ。ArrayListの使い方などを調べて書きました。(ってか正直本番で書いたコードをC#で書けなかった…)

public class CubeStickers {
    public string isPossible(string[] sticker) {
        string res;
        ArrayList list = new ArrayList();
        ArrayList dist = new ArrayList();
        int n1=0, n2=0;
        for (int i = 0; i < sticker.Length; i++)
        {
            if (list.IndexOf(sticker[i]) == -1)
            {
                list.Add(sticker[i]);
                n1++;
            }
            else if (dist.IndexOf(sticker[i])==-1)
            {
                dist.Add(sticker[i]);
                n2++;
            }
        }
        if (n1+n2>=6) {
            res="YES";
        } else {
            res="NO";
        }
        return res;
    }
}

なんでこれでいいのか?
とりあえず3,4と調べていくとあっていることはわかりますが…

おそらく全面を考えたときに6個違うのがあればよくてそれが隣り合わないには少なくとも・・・いや頭混乱してるのでやめておきます。


一応Easyもやってみた。Hardはまず解法がまったくわからないのでパス

public class CubeAnts {
    public int getMinimumSteps(int[] pos) {
        int res;
        for (int i = 0; i < pos.Length; i++)
        {
            switch (pos[i])
            {
                case 1:
                case 4:
                case 3:
                    pos[i] = 1;
                    break;
                case 2:
                case 5:
                case 7:
                    pos[i] = 2;
                    break;
                case 6:
                    pos[i] = 3;
                    break;
            }
        }
        Array.Sort(pos);
        res = pos[pos.Length - 1];
        return res;
    }
}

180 Easy

コレは読解ゲー
なんだかんだで色々書いてあるけど結局はカップルの数×2の子供(半分男、半分女)が一ヶ月に生まれて数の合計の半分の水がないと混雑するって考えたときに、何ヶ月後に混雑してしまうかって問題。

直感でなんか見たことあるって思ったけど理解に時間がかかった。

public class DinkyFish {
    public int min(int a, int b)
    {
        if (a < b)
        {
            return a;
        }
        else
        {
            return b;
        }
    }
    public int monthsUntilCrowded(int tankVolume, int maleNum, int femaleNum) {
        int res;
        int sumDinky = maleNum + femaleNum;
        for (res = 0; (double)sumDinky/2<=tankVolume; res++)
        {
            sumDinky += min(maleNum, femaleNum) * 2;
            maleNum += min(maleNum, femaleNum);
            femaleNum += min(maleNum, femaleNum);
        }
        return res;
    }
}

Mediumも問題文難しいし、おそらく知識ゲーなので辞めときます。