[poj2142] 天平The Balance

原创 2017年01月03日 16:42:41

题目描述

现有一天平,质量为a和b的砝码,已知砝码数量不限且天平左右均可放砝码,现要求在天平上称出质量为c的物品。
编程求一种可行方案。要求:放置的砝码数量尽可能少;当砝码数量相同时,总质量尽可能少。


输入格式

输入数据有多组,每组占一行,从左到右分别为a,b,c。其中a!=b,a<=10000,b<=10000,c<=50000。输入数据以0 0 0终止。


输出格式

对应每组输入输出满足题目要求的两个数据x,y,分别代表质量为a的砝码的数量和质量为b的砝码的数量。


样例数据

样例输入

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

样例输出

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


题目分析

问题等价于求解ax+by=c的一组整数解(x,y),要求|x|+|y|尽量小,若相等,要求a|x|+b|y|尽量小。(系数归于未知数中,若x<0,表示砝码物体放同一侧)
使用扩展欧几里得解出通解x=x0+b/d*t,y=y0-a/d*t
假设a>b,因此f(t)=|x0+b/d*t|+|y0-a/d*t|只有在|y0-a/d*t|=0时取到最小值,因为四舍五入,因此需要左右摆动1单位。


源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
inline const int Get_Int() {
    int num=0,bj=1;
    char x=getchar();
    while(x<'0'||x>'9') {
        if(x=='-')bj=-1;
        x=getchar();
    }
    while(x>='0'&&x<='9') {
        num=num*10+x-'0';
        x=getchar();
    }
    return num*bj;
}
LL Exgcd(LL a,LL b,LL &x,LL &y) {
    if(b==0) {
        x=1;
        y=0;
        return a;
    }
    LL ans=Exgcd(b,a%b,x,y),tmp=x;
    x=y;
    y=tmp-a/b*y;
    return ans;
}
int main() {
    while(true) {
        LL a=Get_Int(),b=Get_Int(),c=Get_Int();
        if(a==0&&b==0&&c==0)break;
        bool bj=0;
        if(a<b) { //保证a>b
            swap(a,b);
            bj=1;
        }
        LL x0,y0;
        LL gcd=Exgcd(a,b,x0,y0);
        x0*=c/gcd;
        y0*=c/gcd;
        LL t=y0*gcd/a,Min=1e18,x,y; //f(t)=|x0+b/gcd*t|+|y0-a/gcd*t|在y0-a/gcd*t时取到最小值
        for(int i=t-1; i<=t+1; i++) {
            LL tx=abs(x0+b/gcd*i),ty=abs(y0-a/gcd*i); //放大
            if(tx+ty<Min) {
                Min=tx+ty;
                x=tx;
                y=ty;
            }
        }
        if(bj)swap(x,y);
        printf("%lld %lld\n",x,y);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj 1837 Balance(01背包 天平平衡)

题目大意: 有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。 其中可以把天枰看做一个以x轴0点作为平衡点的横轴 输入...

POJ 1837:Balance 天平DP。。。

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11878   Accep...

POJ 2142 The Balance 拓欧

The Balance   Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a do...

POJ_2142_The Balance(模线性方程)

The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3341   Ac...

poj2142(THE BALANCE)(扩展欧几里得入门题)

总共要考虑一下三种情况 1. a *x=b*y+d; 2. a*x=b*y-d; 3. a*x+b*y=d;(其中x和y均为非负整数,可由扩展欧几里得算法求得)#include #...

POJ 2142 The Balance

Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measure a dose...

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

题意:Ax+By=C;求一组解x,y使abs(x)+abs(y)最小,若abs(x)+abs(y)相等,则使(A*abs(x)+B*abs(y))最小   解法:在有解的情况下先得到一组解使x为最...

POJ2142_The Balance_扩展欧几里得

The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6456   Accepted: 2840...

POJ 1837-Balance(01背包-天平平衡)

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14034   Accep...

poj1837Balance【二维01背包方法数——天平平衡】

题意:已知砝码(都只有一个)和天平左右挂钩的位置,问有多少种使得天平平衡的方法 做法:很容易想到暴力——————是不行的,那么也容易想到dp[]下标是表示当前重量,思维定势在背包问题不用表示物品序号...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)