AtCoder Beginner Contest 252 C - Slot Strategy
問題の要約
N個のリールからなるスロットがある。
i番目のリールの配列は文字列Siによって表される。ここでSiは0,1,...,9がちょうど1回ずつ現れる長さ10の文字列。
それぞれのリールには対応するボタンがついており、各非負整数tについて、スロットが回り始めてからちょうどt秒後にボタンを1つ選んで押す(または何もしない)ことができる。
スロットが回り始めたからt秒後にi番目のリールに対応するボタンを押すと、i番目のリールはSiの(t mod 10)+1文字目を表示して止まる。
全てのリールを止めた上で、表示されている文字が全て同じであるようにしたい。
目標を達成できるように全てのリールを止めるまでに、スロットが回り始めてから最小で何秒かかるかを求めよ。
制約
1<=N<=100
Siは0,1,...,9がちょうど1回ずつ現れる長さ10の文字列
入力
N
S1
S2
...
SN
考え方
1,0から9までの文字全てについて最小の秒数を求めればよい。
ある文字cについて最小の秒数を求めたいとする。
秒数t=0から始めて、N個のリールを順にt%10の位置にある文字がcであるかどうかを調べていく(0始まりなことに注意)。
cであった場合、そのリールを削除する。
全てのリールがなくなるまで繰り返す。
実際のプログラム
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int f(vector<string> S, const char c){
int t = 0;
while(!S.empty()){
for(int i = 0; i < static_cast<int>(S.size()); ++i){
if(S[i][t%10] == c){
S.erase(S.begin()+i);
break;
}
}
++t;
}
return t-1;
}
int main(){
int N;
cin >> N;
vector<string> S(N);
for(int i = 0; i < N; ++i){
cin >> S[i];
}
int min_t = 100000;
for(int i = 0; i <= 9; ++i){
min_t = min(min_t, f(S,static_cast<char>('0'+i)));
}
cout << min_t << endl;
return 0;
}