POJ2142:The Balance——题解
http://poj.org/problem?id=2142
题目大意:有一天平和两种数量无限的砝码(重为a和b),天平左右都可以放砝码,称质量为c的物品,要求:放置的砝码数量尽量少;当砝码数量相同时,总质量尽量小。
显然转换成ax+by=c的问题,求|x|+|y|最小且|ax|+|by|最小的可行解。
又是exgcd板子题。
#include<cstdio> #include<cctype> #include<iostream> using namespace std; typedef long long ll; int gcd(int a,int b){ return b?gcd(b,a%b):a; } void exgcd(int a,int b,int &x,int &y){ if(b==0){ x=1;y=0; return; } exgcd(b,a%b,x,y); int temp; temp=x; x=y; y=temp-(a/b)*y; return; } int main(){ int a,b,c; while(cin>>a>>b>>c){ if(a==b&&b==c&&a==0)return 0; int x1,y1,x2,y2,x,y; int g=gcd(a,b); a/=g;b/=g;c/=g; exgcd(a,b,x,y); x1=(x%b*c%b+b)%b; y1=(c-x1*a)/b; if(y1<0)y1=-y1; y2=(y%a*c%a+a)%a; x2=(c-y2*b)/a; if(x2<0)x2=-x2; if(x1+y1>x2+y2||(x1+y1==x2+y2&&a*x1+b*y1>a*x2+b*y2)){ y1=y2;x1=x2; } printf("%d %d\n",x1,y1); } return 0; }