Official

B - Pick Two Editorial by physics0523


荷物は区画番号の小さい方から \(2\) 個ずつ組にして運び出されることになります。
よって、荷物のある区画番号を小さい方から順に全て知ることができれば、それらを \(2\) 個ずつ組にして出力すればこの問題に正解できます。

この問題で与えられるのは倉庫の状態を表現する文字列 \(S\) のみです。この \(S\) から荷物のある区画番号を小さい順に全てリストアップするためにはどうすれば良いでしょうか?

例えば、以下の手順を踏めば良いです。

  • まず、 \(S\) の長さを調べる。
    • 多くの言語には文字列の長さを調べる機能があるので、それを利用すると便利です。
  • 次に、 \(S\) を前から順に調べる。
    • もし # が見つかれば、そこに荷物が存在することが分かる。
    • このとき、荷物のある区画番号のリストの末尾に要素を \(1\) つ追加する。可変長の配列を利用すると便利です。

詳しくは以下の実装例も参照してください。
なお、言語によっては文字列の最初の文字が \(0\) 文字目となり、正しく求解するためには \(1\) を足さなければいけない場合もあることに注意してください。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  string S;
  cin >> S;
  vector<int> a;
  for(int i=0;i<S.size();i++){
    if(S[i]=='#'){ a.push_back(i+1); }
  }
  for(int i=0;i<a.size();i+=2){
    cout << a[i] << "," << a[i+1] << "\n";
  }
  return 0;
}

posted:
last update: