POJ - 2142 The Balance(扩展欧几里得)
生活随笔
收集整理的這篇文章主要介紹了
POJ - 2142 The Balance(扩展欧几里得)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目鏈接:點(diǎn)擊查看
題目大意:給出兩種重量的砝碼,我們需要利用天平稱出指定重量的藥物,我們需要求出這兩種砝碼各自的數(shù)量,使得砝碼數(shù)量之和最小
題目分析:我們可以先列出關(guān)系式,假設(shè)兩個(gè)砝碼的重量分別為a和b,我們需要秤的藥物重量為c,那么我們可以得出關(guān)系式a*x+b*y=c,用擴(kuò)展歐幾里得可以算出x和y,然后我們分兩種情況討論:
這樣分類討論一下答案就出來了,最后比較一下abs(x1)+abs(y1)和abs(x2)+abs(y2)的大小,然后輸出答案即可
代碼:
#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=70;int ex_gcd(int a,int b,int &x,int &y) {if(b==0){x=1;y=0;return a;}int ans=ex_gcd(b,a%b,y,x);y-=a/b*x;return ans; }int main() { // freopen("input.txt","r",stdin);int a,b,c;while(scanf("%d%d%d",&a,&b,&c)!=EOF&&a+b+c){int x,y;int d=ex_gcd(a,b,x,y);//d為a和b的最大公約數(shù) //因?yàn)轭}目保證一定有解,所以c%d一定等于0a/=d;b/=d;c/=d;ex_gcd(a,b,x,y);//計(jì)算出ax+by=1的解 //因?yàn)槲覀冇?jì)算的是ax+by=1的x和y,所以在等式兩邊需要再乘上c才行int x1=x*c;//第一種情況x1=(x1%b+b)%b;int y1=(c-x1*a)/b;if(y1<0)y1=-y1;int y2=y*c;//第二種情況y2=(y2%a+a)%a;int x2=(c-y2*b)/a;if(x2<0)x2=-x2;if(x1+y1>x2+y2)printf("%d %d\n",x2,y2);elseprintf("%d %d\n",x1,y1);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的POJ - 2142 The Balance(扩展欧几里得)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1011 Sticks(df
- 下一篇: POJ - 2115 C Looooop