POJ2142-The Balance【扩欧】
生活随笔
收集整理的這篇文章主要介紹了
POJ2142-The Balance【扩欧】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
感謝x某q的幫助
這是它的博客(只有找本人才會解釋的博客):
https://blog.csdn.net/sugar_free_mint/article/details/80755188
正題
題目鏈接:
http://poj.org/problem?id=2142
大意
有三種東西,重量不同,A種只能放左邊;B種只能放右邊;C種只有一個,兩邊都可以放。A和B隨便放多少個都行但是C必須放,要求兩邊重量相等。求在滿足放的東西最少,之后滿足重量最小的放置方案
解題思路
首先推出公式
Ax=By+cAx=By+c
oror
By=Ax+cBy=Ax+c
然后移項得
Ax?By=cAx?By=c
oror
By?Ax=cBy?Ax=c
然后是不是又有些眼熟,沒錯了就是擴歐ax+by=cax+by=c。之后我們發現我們之前那個(x?((b?a)/d)%(k/d)+(k/d))%(k/d)(x?((b?a)/d)%(k/d)+(k/d))%(k/d)的公式如果既求x又求y的話就會不成立。
然后就場外求助用一種方法,用最小的x來求y和用最小的y來求x之后可以判斷那個更優。
代碼
#include<cstdio> #include<algorithm> using namespace std; int x,y,a,b,c,x1,y1,x2,y2; int gcd(int a,int b) {if (b==0){x=1;y=0;return a;}int d=gcd(b,a%b),k=x;x=y;y=k-(a/b)*y;return d; } int main() {while (true){scanf("%d%d%d",&a,&b,&c);if (a==0&&b==0&&c==0) return 0;int gcde=__gcd(a,b);a/=gcde;b/=gcde;c/=gcde;//提前除去方便些int d=gcd(a,b),g=b;x1=(x*c%b+b)%b;//求最小的xy1=(a*x1-c)/b;//算出yif (y1<0) y1=-y1;//確定是那個公式y2=(y*c%a+a)%a;//求最小yx2=(b*y2-c)/a;//算出xif (x2<0) x2=-x2;//確定公式if (x1+y1<x2+y2) printf("%d %d\n",x1,y1);else printf("%d %d\n",x2,y2);//比較方案} }轉載于:https://www.cnblogs.com/sslwyc/p/9218505.html
總結
以上是生活随笔為你收集整理的POJ2142-The Balance【扩欧】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj1854 [Scoi2010]游
- 下一篇: 怎样用jQuery拿到select中被选