yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

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;
}