SRM456 div2

初参戦。結構練習してきたけど、時間制限があるとなかなか難しい。

250 AppleWord

指定した文字列をAppp .... pppleという形式の文字列に変換するときに、変更しなければならない文字数を調べる。

これは簡単。文字列を頭から調べて、変換してみて回数を数えるだけ。でも、実践では15分くらいかかった。慣れないと難しい。

500 SilverDistance

将棋の銀を動かして、任意の升目に移動するための移動回数の計算。

他の人の回答は、

  1. まず、斜め移動のみで移動させてみて、移動回数を計算。
  2. 次に、一回前に移動させた状態から、斜め移動のみで計算。
  3. 1.と2.の比較で短い方を採用。

というのが多かったです。前移動2回は斜めで置き換えられるので、これで問題なし。
しかし、思いつかなかったので、銀を実際に動かして計算しました。デバッグが辛かったです。

自戒の意味も込めて、自分の解答を貼っておきます。

  int minSteps(int sx, int sy, int gx, int gy) {
    int result=0;
		// 現在位置との差分を見る。
		int dx = gx - sx;
		int dy = gy - sy;
		//
		int count=0;
		bool flip = false;
		while(dx!=0 || dy!=0) {
			if (dx < 0) {
				if (dy < 0) {
					dx++;
					dy++;
					result++;
				} else if (dy > 0) {
					dx++;
					dy--;
					result++;
				} else {
					dx++;
					dy++;
					result++;					
				}
			} else if (dx == 0) {
				if (dy > 0) {
					dy--;
					result++;					
				} else {
					dx--;
					dy++;
					result++;
				}
			} else {
				if (dy < 0) {
					dx--;
					dy++;
					result++;
				} else if (dy > 0) {
					dx--;
					dy--;
					result++;
				} else {
					dx--;
					dy++;;
					result++;					
				}
			}
		}
		return result;
  }

ダサいなあ。しょんぼり。

1000 CutSticks

時間がなかったので、問題文を読んだだけ。ネットで見たら、2分探索らしいです。全然思いつける気がしない。

このレベルの問題をコンスタントに解けるようになるのが目標かな。頑張ります。

結果

レーティング1338で、次からdiv1です。やった! 次も頑張ります。