<問題>
①1~9個の面を持つサイコロがあり、決められた数だけ存在する。
②どのサイコロを与えられたかはわからない。同じ面を持つサイコロは複数存在しうる。
③そのサイコロの集合を複数回投げて、出た表の面の集合が与えられる。
④このとき、可能性のあるサイコロの集合のうち最も面の数が少なくなるような和を返す。
<解き方>
全ての面の出方についてそれぞれソートする。
ソートした後、それぞれの1番目の要素の中で最大のものが
1番目の要素の最小の答えとなる。
2番目以降も同様。
最後に求めた全ての要素の和を返す。
<コード>
class RollingDiceDivTwo {
public: int minimumFaces(vector<string> rolls) {
int n=rolls.size(),ret=0;
vector <int> ans(rolls[0].size(),0);
FORE(i,0,n)sort(rolls[i].begin(),rolls[i].end());
FORE(i,0,n){
FORE(j,0,rolls[0].size()){
if(ans[j]<rolls[i][j]-'0')ans[j]=rolls[i][j]-'0';
}
}
FORE(i,0,rolls[0].size())ret+=ans[i];
return ret;
}
};
①1~9個の面を持つサイコロがあり、決められた数だけ存在する。
②どのサイコロを与えられたかはわからない。同じ面を持つサイコロは複数存在しうる。
③そのサイコロの集合を複数回投げて、出た表の面の集合が与えられる。
④このとき、可能性のあるサイコロの集合のうち最も面の数が少なくなるような和を返す。
<解き方>
全ての面の出方についてそれぞれソートする。
ソートした後、それぞれの1番目の要素の中で最大のものが
1番目の要素の最小の答えとなる。
2番目以降も同様。
最後に求めた全ての要素の和を返す。
<コード>
class RollingDiceDivTwo {
public: int minimumFaces(vector<string> rolls) {
int n=rolls.size(),ret=0;
vector <int> ans(rolls[0].size(),0);
FORE(i,0,n)sort(rolls[i].begin(),rolls[i].end());
FORE(i,0,n){
FORE(j,0,rolls[0].size()){
if(ans[j]<rolls[i][j]-'0')ans[j]=rolls[i][j]-'0';
}
}
FORE(i,0,rolls[0].size())ret+=ans[i];
return ret;
}
};