マルチメディア研究部

マルチメディア研究部

マルチメディア研究部の非公式サイトです

AtCoder Beginner Contest098に参加しました

AtCoder Beginner Contestとは?

こんにちはstです。

AtCoder Beginner Contestは、AtCoderで開催されている初心者向けのプログラミングコンテストです。

競技プログラミングと呼ばれている形のコンテストですね。

このコンテストに部員は毎週参加しています。

私はC問題までしかできませんでしたが、D問題を解いている人もいました。すごい。

できなかったなりに解説をしてみようと思います。
(言語はC++になります)

解法

A問題

A+B、A-B、A*Bの最大値を求める問題です。

if文を書いてもいいんですが、std::max()を使えばスマートに書くことができます。

ただ、3つ以上の最大値をとるときには中に{}をいれなくてはならないので注意が必要です。

こんな感じですね。

cout<<max({A+B,A-B,A*B})<<endl;

ここまで2分ですね。

B問題

すみません。

多分2重ループか3重ループなんでしょうが、脳死していたためsetとsetの二刀流で解きました。

setを使うとすると、

まず、文字列を前から見ていきます。

0から現在いる文字列の添え字(例えばi)までの各文字をset(ここではs1とする)にぶち込み(insert)、重複除去します。

現在いる文字列の添え字(例えばi)から文字列の最後までループを回し、s1.find()でs1に入っているか調べ、あったら新しいset(s2とする)にそれをinsertします。

最後のs2のsizeの最大値をとっておわり。

汚いですが一応載せときます。

for(int i=0;i<S.size()-1;i++){
	set<char> s1,s2;
	for(int j=0;j<=i;j++){
		s1.insert(S[j]);
	}
	for(int j=i+1;j<=S.size();j++){
		if(s1.find(S[j])!=s1.end()){
			s2.insert(S[j]);
		}
	}
	if(s2.size()>max){
		max=s2.size();
	}
}

ここまで8分です(遅い

C問題

これですよ。

死んだの。

気づくまで40分かかった。

  1. Eの数を数える(変数cntに保存)
  2. 文字列Sを見ていって、S[i]=='E'ならcntを1減らし、S[i-1]=='W'なら1を足す。
  3. cntの最大になるときの値が答え。

雑ですみません。

D問題

解けず

感想

レートは上がりましたが、見直すところが多かったですね。
(特にset乱用が癖になってる)