AOJ 1248 The Balance

問題

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1248

2つの重りと計りたい分量が与えられる。それぞれ重りをいくつ使えば計れるか?

重りはより少なく、軽いものを選ぶ。

解法

aの数、xがでれば、yは一つに定まる。xに関するループを回して答えを更新していく。

コード

int a, b, d;

bool cmp(int ax, int ay, int bx, int by){
  if(ax+ay != bx+by) return ax+ay < bx+by;
  return a*ax+b*ay < a*bx+b*by;
}

int main(){
  while(scanf("%d%d%d", &a, &b, &d) && a+b+d){
    int resx = (INF)/2, resy = (INF)/2, r, l, y;
    rep(x, 50000){
      r = a*x + d;
      if(!(r%b)){
    y = r/b;
    if(cmp(x,y,resx,resy)) resx = x, resy = y;
      }
      l = a*x - d;
      if(l >= 0 && !(l%b)){
    y = l/b;
    if(cmp(x,y,resx,resy)) resx = x, resy = y;
      }
      l = d - a*x;
      if(l >= 0 && !(l%b)){
    y = l/b;
    if(cmp(x,y,resx,resy)) resx = x, resy = y;
      }
    }

    printf("%d %d\n", resx, resy);
  }
  return 0;
}