SRM454 DIV2

折角ポイントできたものをつまらないミスで落としたorz
順調にrate降下中。次回は少しでも上げて行きたいなあ。
焦らず確実に、でも素早くっていうのに慣れたい。

250

ABCと3つの値が与えられる。入力された数値それぞれの各桁の値を足し算した数値を求め
A以上B以下の値で、Cに一番近く一番小さい数値を出力しろっていう問題。
しばらくこの意味がわからずに英文とにらめっこ。
ループの数が多くなりそうだったので、メモ化しながら書いては試し書いては試ししてたらコードが伸びる伸びる。
もうちょっと綺麗に書きたかったなあ。
同じ部屋の方がものすごく美しいコードを書いてて、関心すると同時にへこむ。
ループの終了条件をB以下にしないといけなかったのに、未満にしてしまってて落とされたorz
取れたものを凡ミスで落とすなんてどうしようもない・・・
載せたコードは練習部屋で直してシステムテストを通過したものです。

#include <iostream>

using namespace std;

class MinimalDifference
{
  private:
  int sumDigit(int n)
  {
    int ret = 0;

    for(; n / 10 != 0;)
    {
      ret += n % 10;
      n /= 10;
    }

    return ret + n;
  }

  public:
  int findNumber(int A, int B, int C)
  {
    bool flag = false;
    int ans = 0;
    int buf1 = 0;
    int buf2 = 0;
    int buf3 = 0;
    int min = 1000000000;

    if(B == 1) return 1;

    buf1 = sumDigit(C);

    for(int i = A; i <= B ; i++)
    {
      buf2 = sumDigit(i);

      if(buf1 == buf2)
      {
        ans = i;
        flag = true;
        break;
      }

      else if(min > abs(buf2 - buf1))
      {
        min = abs(buf2 - buf1);
        buf3 = i;
      }
    }

    if(!flag) ans = buf3;
		
    return ans;
  }
};

500

複数行の文字列の中から、指定された文字列を得るには文字を何回交換すればいいかっていう問題。
横1列で成立させてもいいし縦複数行で成立させてもいいっていうのが厄介。
苦手な文字列操作系で軽く思考停止する。
縦で得るにはどうしたらいいか考えてたら時間終了した。