当前位置: 代码迷 >> 综合 >> POJ 2142 The Balance .
  详细解决方案

POJ 2142 The Balance .

热度:57   发布时间:2023-09-23 08:27:05.0

题目地址:http://poj.org/problem?id=2142

有两种可能的情况:

a与d放在一起,即 ax+d=by

b与d放在一起,即 ax=by+d

因为x,y是任取的 ,所以解下面一个方程

ax+by=d 

利用扩展欧几里得定理,可得两组解,

1. x的最小非负解,及其对应的y

2. y的最小非负解,及其对应的x

因为求的是|x|+|y|的最小值,比较一下就好了

#include<iostream>
#include<cmath>
#include<cstdio>
using namespace std;
int gcdEx(int a,int b,int& x,int& y)
{   //求ax+by=gcd(a,b) 的整数解 返回gcd(a,b); if(b==0) {x=1; y=0; return a;}int x1,y1;int gcd=gcdEx(b,a%b,x1,y1);x=y1;y=x1-a/b*y1;return gcd;
}
int main()
{int a,b,d; int x,y;while(cin>>a>>b>>d){if(a==0&&b==0&&d==0) break;int gd=gcdEx(a,b,x,y);int k=d/gd,s1=b/gd,s2=a/gd;int x1=(k*x%s1+s1)%s1,y1=fabs(d-a*x1)/b; int y2=(k*y%s2+s2)%s2,x2=fabs(d-b*y2)/a; if(x1+y1<x2+y2)	cout<<x1<<' '<<y1<<endl;else cout<<x2<<' '<<y2<<endl;}return 0;
}