B - Two Colors Card Game
問題文
高橋君は青いカードを N 枚,赤いカードを M 枚持っています。 カードにはそれぞれ文字列が書かれており, i 枚目の青いカードに書かれている文字列は s_i, i 枚目の赤いカードに書かれている文字列は t_iです。
引用テキスト
高橋君は,文字列を 1 つ言います。 そして,全てのカードを確認し, その文字列が書かれた青いカードを 1 枚見つけるごとに 1 円貰えます。 また,その文字列が書かれた赤いカードを 1 枚見つけるごとに 1 円失います。
引用テキスト
なお,高橋君の言った文字列と,カードに書かれた文字列が完全に一致していた場合のみを考えます。 例えば,高橋君が atcoder と言った場合,atcoderr,atcode,btcoder などと書かれた青いカードがあってもお金は貰えません(逆に,このような文字列が書かれた赤いカードがあってもお金を失うことはありません)。
引用テキスト
高橋君は,最大で差し引き何円貰うことができるでしょうか?
引用テキスト
ただし,違うカードに同じ文字列が書かれていることもあることに注意してください。
この問題に対して次のような解答を作成しました。
コード c++(GCC9.2.1)
using namespace std; int main() { //blueとredの文字列の配列を読み込む int N,M; cin>>N; vector<string> blue(N); for(int i; i<N;i++) cin>>blue.at(i); cin>>M; vector<string> red(M); for(int i; i<M;i++) cin>>red.at(i); /*blueに格納された1つ1つの文字列について、 変数countをblueに同じものがある度に+1,redに同じものがある度に-1する*/ int max=0; for(int i;i<N;i++){ int count=0; for(int k;k<N;k++){ if(blue.at(i)==blue.at(k)) count++; } for(int k;k<M;k++){ if(blue.at(i)==red.at(k)) count--; } if(count>max) max=count; /*countの最大値を保存する。*/ } cout<<max<<endl; }
しかし、入力
3
apple
orange
apple
5
apple
apple
apple
apple
apple
に対して、
実行エラー
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 18446744072489752576) >= this->size() (which is 5)
と表示されたり、
2
と出力されたりします。(この入力に対する正解は1)
この原因を教えてください。
私は5日程前から競プロのためにC++を勉強し始め、プログラミングに関する詳しい知識がほとんどないため、乱数を使っているわけでもないのに同じ入力に対して実行する度にエラーになったりならなかったりするのか見当もつきません。ご教授ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/25 16:13