[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;
}

版权声明:博客已搬迁至http://bill.moe

poj2142 The Balance(扩展欧几里得算法)

The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6423   Ac...
  • update7
  • update7
  • 2017年03月02日 16:43
  • 16050

POJ2142 The Balance(扩展欧几里得算法)

The Balance Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6473   Accepted: 2849...
  • H_Fighter
  • H_Fighter
  • 2017年04月01日 11:57
  • 210

POJ2142 The Balance【二元一次方程】

题目大意: 有一个天平,还有质量为a和质量为b的砝码,砝码的数量不限且天平左右两端均可放砝码,现在要求 在天平上惩处质量为c的物品。那么问题来了:怎样放置砝码,才能使放置的砝码数量尽可能的少;当 砝码...
  • u011676797
  • u011676797
  • 2015年03月19日 20:44
  • 460

POJ 2142The Balance(扩展欧几里得)

The Balance Description Ms. Iyo Kiffa-Australis has a balance and only two kinds of weights to measu...
  • wust_xhj
  • wust_xhj
  • 2015年07月17日 13:47
  • 1066

POJ 1837:Balance 天平DP。。。

Balance Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11878   Accep...
  • u010885899
  • u010885899
  • 2015年08月04日 23:00
  • 486

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

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

测试赛B - Balance(天平的dp问题)

B - Balance Time Limit:1000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Sta...
  • u013015642
  • u013015642
  • 2014年07月30日 14:47
  • 1413

POJ - 1837 Balance 天平(二维01背包)

提示:动态规划,01背包 初看此题第一个冲动就是穷举。。。。不过再细想肯定行不通= =O(20^20)等着超时吧。。。 我也是看了前辈的意见才联想到01背包,用动态规划来解   ...
  • h1021456873
  • h1021456873
  • 2017年04月19日 17:58
  • 128

笔记——负载均衡(Load Balance)

为什么会想到去了解、学习负载均衡呢?
  • cjh095
  • cjh095
  • 2014年07月31日 14:17
  • 824

poj 1837 天平平衡问题

题目大意: 给你n个天平的位置,m个不同质量的砝码,每一种砝码至多用一次,问使天平平衡的方法有多少; 解题思路: 我们用dp[i][j]表示放i个砝码,力矩为j的方案数;因此转移方程有dp[i]...
  • buctyyzyn
  • buctyyzyn
  • 2015年03月28日 09:47
  • 418
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[poj2142] 天平The Balance
举报原因:
原因补充:

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