解いた問題のソースコードと解説など。


SRM 522 Div2 Hard CorrectMultiplicationTwo

問題

http://apps.topcoder.com/stat?c=problem_statement&pm=11609&rd=14547
a * b = cという等式が与えられる。しかしこの等式は成り立っていないのでa,b,cをA,B,Cに書き換えてA * B = Cが成り立つようにしたい。|A - a| + |B - b| + |C - c|の最小値はいくつか。

1 <= a,b,c,A,B,C <= 1000000

やりかた

Aを1から1000000まで試してみる。B = c / Aなのでこの前後±2くらい調べてあげればいい。
intのオーバーフローに注意。

以下ソース。

class CorrectMultiplicationTwo {
public:
  ll sub(int x, int y, int z){
    ll a = (ll)(z - x * y);
    return a > 0 ? a : -a;
  }
  int getMinimum(int a, int b, int c) {
    ll result = INF;
    if(b > a) swap(a, b);
    for(int i = 1; i <= 1000000; i++){
      int j = c / i;
      for(int d = -3; d <= 3; d++){
	if(j + d > 0)
	  result = min(result, abs(a - i) + abs(b - (j + d)) + sub(i, j + d, c));
      }
    }
    return result;
  }
};

900はだいぶできるようになっていると思う。1000との違いが大きい。

中だるみがはげしい。ペースがどんどん落ちている。

しょげないでよBaby 眠れば治る