解いた問題

1/30/2013

SRM568 Div1 Easy

250

赤緑青のボールを入れる箱をそれぞれ少なくとも1つは選ばなくてはいけない。
その1つを選び、残りは最も手数の少なくて済む色にしてしまう。


class BallsSeparating {
public:
  int minOperations(vector <int> R, vector <int> G, vector <int> B)
  {
    const int N = R.size();
    const int inf = 1 << 29;
    int ret = inf;

    int costR[N];
    int costG[N];
    int costB[N];
    for (int i = 0; i < N; ++i) {
      costR[i] = G[i] + B[i];
      costG[i] = R[i] + B[i];
      costB[i] = G[i] + R[i];
    }

    for (int r = 0; r < N; ++r) {
      for (int g = 0; g < N; ++g) {
        for (int b = 0; b < N; ++b) {
          {
            set<int> cnt;
            cnt.insert(r);
            cnt.insert(g);
            cnt.insert(b);
            if (cnt.size() != 3) continue;
          }
          int cost = costR[r] + costG[g] + costB[b];
          for (int i = 0; i < N; ++i) {
            if (i == r) continue;
            if (i == g) continue;
            if (i == b) continue;
            cost += min(costR[i], min(costG[i], costB[i]));
          }
          ret = min(ret, cost);
        }
      }
    }


    return ret == inf ? -1 : ret;
  }
};