POJ 2142 The Balance

The Balance

Time Limit: 5000MS   Memory Limit: 65536K
Total Submissions: 6325   Accepted: 2787

Description

Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine and three 300mg weights on the opposite side (Figure 1). Although she could put four 300mg weights on the medicine side and two 700mg weights on the other (Figure 2), she would not choose this solution because it is less convenient to use more weights. 
You are asked to help her by calculating how many weights are required. 

Input

The input is a sequence of datasets. A dataset is a line containing three positive integers a, b, and d separated by a space. The following relations hold: a != b, a <= 10000, b <= 10000, and d <= 50000. You may assume that it is possible to measure d mg using a combination of a mg and b mg weights. In other words, you need not consider "no solution" cases. 
The end of the input is indicated by a line containing three zeros separated by a space. It is not a dataset.

Output

The output should be composed of lines, each corresponding to an input dataset (a, b, d). An output line should contain two nonnegative integers x and y separated by a space. They should satisfy the following three conditions.

  • You can measure dmg using x many amg weights and y many bmg weights.
  • The total number of weights (x + y) is the smallest among those pairs of nonnegative integers satisfying the previous condition.
  • The total mass of weights (ax + by) is the smallest among those pairs of nonnegative integers satisfying the previous two conditions.

No extra characters (e.g. extra spaces) should appear in the output.

Sample Input

700 300 200
500 200 300
500 200 500
275 110 330
275 110 385
648 375 4002
3 1 10000
0 0 0

Sample Output

1 3
1 1
1 0
0 3
1 1
49 74
3333 1

Source

Japan 2004

#include <cstdio>
#include <algorithm>
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1; y=0;
        return a;
    }
    int ans=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return ans;
}
int main() {
    int a=1,b,c,x,y;
    bool Gavin;
    while (a || b || c){
        scanf("%d%d%d",&a,&b,&c);
        if (!a&&!b&&!c) break; //之前没有加这一句,输入最后的000结束时会继续运行一次,致命错误,被0除。
        Gavin=0;
        if(a<b){
        swap(a,b);Gavin=1;
        }
        int gcd=exgcd(a,b,x,y);
        a/=gcd;b/=gcd;c/=gcd;
        x*=c;y*=c;
        int t=y/a,x1,y1,x2,y2,ansx,ansy;
        while(y-a*t<0) t--;
        x1=abs(x+b*t);y1=abs(y-a*t);
        t++;
        x2=abs(x+b*t);y2=abs(y-a*t);
        if ((x1+y1<x2+y2)||(x1+y1==x2+y2)&&(x1*a+y1*b<x2*a+y2*b))
         ansx=x1,ansy=y1;
        else ansx=x2,ansy=y2;
        if(Gavin) printf("%d %d\n",ansy,ansx);
        else printf("%d %d\n",ansx,ansy);
    }
    return 0;
}
时间: 2024-12-28 21:38:05

POJ 2142 The Balance的相关文章

POJ 2142 The Balance(exgcd)

嗯... 题目链接:http://poj.org/problem?id=2142 AC代码: 1 #include<cstdio> 2 #include<iostream> 3 4 using namespace std; 5 6 inline int _abs(int x){ 7 if(x < 0) return -x; 8 return x; 9 } 10 11 inline void exgcd(int a, int b, int &g, int &x,

POJ 2142 - The Balance [ 扩展欧几里得 ]

题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 (简单的证明应该是分x,y 符号一正一负,和x,y符号都为正来考虑) 扩欧解的方程为 ax+by = gcd(a, b) 先简化问题,等价为扩欧求的是 a'x+b'y = 1 则原方程等价为 a'x+b'y = n' (a, b, n 全部除以gcd(a, b) ) 先解x为最小正值的时候 x =

POJ 2142 The Balance【扩展欧几里德】

题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当x取最小合法正整数解时y的取值,当y小于0时,说明应该放在a的另一边,变为正值.同理当y取最小时,可得到另一组解,比较两组解,取最小即可. #include<stdio.h> int ex_gcd(int a,int b,int &x,int &y){ if(!b){ x=1,y=

The Balance POJ 2142 扩展欧几里得

Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine an

The Balance POJ - 2142

首先,可以知道题目要求解一个\(ax+by=c\)的方程,且\(x+y\)最小. 感性证明: 当\(a>b\)时,\(y\)取最小正整数解,\(b\)减的多,\(a\)增的少,此时\(x+y\)取最小值.(类似比热容与温度之间) 反之亦然. #include<iostream> #include<cmath> #include<cstdlib> using namespace std; int a, b, c; int exgcd(int a, int b, in

POJ 1837:Balance 天平DP。。。

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11878   Accepted: 7417 Description Gigel has a strange "balance" and he wants to poise it. Actually, the device is different from any other ordinary balance. It orders two arms

poj 2142

Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose of medicine. For example, to measure 200mg of aspirin using 300mg weights and 700mg weights, she can put one 700mg weight on the side of the medicine and three 300m

poj 1837 天平Balance

http://poj.org/problem?id=1837 题意:现有一个天平,可以视为x坐标轴,负半轴为天平左边,右半轴为天平右边, 现在天平上有c个挂钩,让你挂上g个的砝码,问有几种挂法使得天平平衡, 2 <= C <= 20 :   2 <= G <= 20  : 挂钩坐标[-15,15]  ;   砝码重量[1,25]  ; 思路:试想,每次挂上一个砝码   天平的平衡度  是受  前一个砝码的位置  的影响   故   可以考虑用动态规划 可不可以把 第一个 砝码挂在不

POJ 2142:The Balance_扩展欧几里得(多组解)

先做出两个函数的图像,然后求|x|+|y|的最小值.|x|+|y|=|x0+b/d *t |+|y0-a/d *t| 这个关于t的函数的最小值应该在t零点附近(在斜率大的那条折线的零点附近,可以观察出来).以下三种情况中,函数最小值都应该出现在B点附近./* 对于不定整数方程xa+yb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解. 上面已经列出找一个整数解的方法,在找到x * a+y * b = Gcd(a, b)的一组解x0,y0后 ,/*x * a+y