SRM 536 Div2 Medium minimumFaces

500にしては簡単だった.
m個のサイコロをn回振って出た目rolls[n][m]が与えられる.
i回目に振って出た目はrolls[i]だが中身は順不同なのでどのサイコロの出た目なのかはわからない.
各サイコロは何個の面があるのかは分からないが,s個の面だった場合,必ず1からsまでの数字が書かれている.
考えられるサイコロの内各サイコロの面の総和が最小となる時の値を答える問題.

一番面が多いサイコロの面は各rolls[j]の最大値の最大値となる.
同様にk番目に面が多いサイコロの面は各rolls[j]の最大からk個目の値の最大値となる.
各rolls[j]をソートさせると簡単に求めることができる.

class RollingDiceDivTwo
{
public:
  int minimumFaces(vector <string> rolls)
    {
      int n = rolls.size();
      int m = rolls[0].size();
      vector<vector<int> > rs(n, vector<int>(m));
      int i, j;
      for(i = 0; i < n; i++){
        for(j = 0; j < m; j++){
          rs[i][j] = rolls[i][j] - '0';
        }
        sort(rs[i].begin(), rs[i].end());
        // for(j = 0; j < m; j++){
        //   cout << rs[i][j];
        // }
        // cout << endl;
      }
      int ret = 0;
      for(j = 0; j < m; j++){
        int mv = 0;
        for(i = 0; i < n; i++){
          mv = max(mv, rs[i][j]);
        }
        // cout << "mv=" << mv << endl;
        ret += mv;
      }
      return ret;
    }
};