mayoko’s diary

プロコンとかいろいろ。

SRM 568 div1 easy: BallsSeparating

解法

box i に色を残しておけない際に, ボールが逃げる場所を作っておかなければなりません。

各色が逃げる場所を r, g, b とした時, ボールを動かす回数は,

  • i==r の時は, green, blue を動かす回数
  • i==g の時は, red, blue を動かす回数
  • i==b の時は, red, green を動かす回数
  • それ以外では, red, blue, green のうち, 一番個数の多いボールを残して他の色のボールを取り除くのが明らかに最適

というアルゴリズムから求めることが出来ます。

class BallsSeparating {
public:
    int minOperations(vector <int> red, vector <int> green, vector <int> blue) {
        const int INF = 1e9;
        int n = red.size();
        int ret = INF;
        for (int r = 0; r < n; r++) for (int g = 0; g < n; g++) for (int b = 0; b < n; b++) {
            if (r==g || g==b || b==r) continue;
            int tmp = 0;
            for (int i = 0; i < n; i++) {
                if (i==r) tmp += green[i]+blue[i];
                else if (i==g) tmp += blue[i]+red[i];
                else if (i==b) tmp += red[i]+green[i];
                else tmp += red[i]+blue[i]+green[i]-max({red[i], blue[i], green[i]});
            }
            ret = min(ret, tmp);
        }
        if (ret == INF) ret = -1;
        return ret;
    }
};