Toy と帽子と ADP BE

主にプログラミングに関わる話をゆるくエモくやっていきます

A. Fast Food Restaurant (Codeforces Round #622 Div. 2)

問題

https://codeforces.com/contest/1313/problem/A

問題概要

整数の組(a, b, c)が与えられる。この組から数字を分配して、(1, 0, 0),(0, 1, 0),(0, 0, 1),(1, 1, 0),(1, 0, 1),(0, 1, 1),(1, 1, 1)という組をできるだけ多くの種類作りたい。何種類作れるか。

考察

必要な数字が少ないもののほうが作りやすいので、先に作ります。具体的には、a, b, cがそれぞれ1以上あれば、対応する(1, 0, 0),(0, 1, 0),(0, 0, 1)が作れます。

次に2つの組み合わせですが、例えばこの時点で残りが(1, 1, 2)だった場合(1, 0, 1),(0, 1, 1)が作れます。しかし先に(1, 1, 0)を作ってしまうと、残りが(0, 0, 2)となってしまうのでよくありません。つまり、数が多いものを優先して使う必要があります。

この条件を実装するのがちょっと怖かったので(おい)、ちょっとひねった場合分けをしました。

その場合分けがこちら

        if (a == 0) {
            if (b == 0 || c == 0) {
                // 何も作れない
            } else {
                // (0, 1, 1)が作れる
                ans++;
            }
        } else {
            if (b == 0) {
                if (c == 0) {
                    // 何も作れない
                } else {
                    // (1, 0, 1)が作れる
                    ans++;
                }
            } else {
                if (c == 0) {
                    // (1, 1, 0)が作れる
                    ans++;
                } else {
                    if (a == 1 && b == 1 && c == 1) {
                        // (1, 1, 1)が作れる
                        ans++;
                    } else if (a > 2 && b > 2 && c > 2) {
                        // たくさんあるので全部作れる
                        ans += 4;
                    } else if (a == 1 || b == 1 || c == 1) {
                        // (仮に a == 1 として)、(1, 1, 0), (1, 0, 1)はどちらかしか作れず、(1, 1, 1)も作れない
                        ans += 2;
                    } else {
                        // a,b,cのうち少なくとも1つが2であるので、(1, 1, 0), (1, 0, 1), (0, 1, 1)は作れるが(1, 1, 1)が作れない
                        ans += 3;
                    }
                }
            }
        }

ですが、これ最初に思いついた方法で実装していたほうが楽でしたね多分・・・。

個人の感想

最初

each visitor should receive no more than one portion of dumplings, no more than one portion of cranberry juice and no more than one pancake with condensed milk;

この条件をスルーしていて、これA問題の割に複雑じゃない?と思って先にBとC1を解いたのでした。結果的に、そのおかげでスコア的に得をして青タッチできたので、人生何が幸いするかわからないとなりました。