C♯の勉強

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

TopCoder SRM619: EmployManager

まず、候補者が全員不採用の状態からスタートすることを考える。
この時点の利益は 「earning の全要素の合計」にマイナスを掛けたものになる。

候補者 a を不採用から採用へと変更すると

  • value[a] の利益が減る
  • 他の不採用の候補者 b がいる場合 earning[a][b] 分だけ利益が上がる
  • 他の採用の候補者 c がいる場合 earning[a][c] 分だけ利益が上がる

となり、結局のところ他の候補者の採用状況に関係なく

  • \(\sum_{i}(\)earning[a][i]\()\) - value[a]

だけ利益が上がる。

よって上記の利益が上がる場合は貪欲に採用していけばよい。

public class EmployManager {
    public int maximumEarnings(int[] value, string[] earning) {
        int n = value.Length;
        int ans = -String.Concat(earning).Sum(c => (int)c - '0') / 2;
        for (int i = 0; i < n; i++) {
            int earn = earning[i].Sum(c => c - '0');
            if (earn - value[i] >= 0) ans += earn - value[i];
        }
        return ans;
    }
}