【第21期】观点:人工智能到底用 GPU?还是用 FPGA?

[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 2142-The Balance(扩展欧几里德)

题目地址:POJ 2142 题意:有两种类型的砝码质量分别为a和b,要求称出质量为d的物品,要求a的数量x和b的数量y的和x+y最小,若有多个x+y的值,取ax+by最小的。 思路:我们应该求ax...

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

[size=medium]KIDx 的解题报告 题目链接:[url]http://poj.org/problem?id=2142[/url] 不懂扩展欧几里得请先参照这里: [url]http://972169909-qq-com.iteye.com/blog/1140914[/url] 题意:输入3个数,前2个是砝码的种类,问各要多少个才能称出第三个数出来【同时要使2个答案之和最小】 [/size] [code="C++"]#include #include using namespace std; #define inf 0x

POJ.2142 The Balance (拓展欧几里得)

POJ.2142 The Balance (拓展欧几里得)题意分析现有2种质量为a克与b克的砝码,求最少 分别用多少个(同时总质量也最小)砝码,使得能称出c克的物品。设两种砝码分别有x个与y个,那么有...

ACM POJ分类

多版本的POJ分类Sempr 发表于 2006-3-30 16:47:00 多版本pku题目分类及算法分类 按照ac的代码长度分类(主要参考最短代码和自己写的代码)短代码:0.01K--0.50K;中短代码:0.51K--1.00K;中等代码量:1.01K--2.00K;长代码:2.01K以上。短:1147、1163、1922、2211、2215、2229、2232、2234、2242、2245、2262、2301、2309、2313、2334、2346、2348、2350、2352、2381、2405、2406;中短:10

POJ 2142 The Balance [不定方程和最小的正整数解]【数论】

题目链接:http://poj.org/problem?id=2142——————————————–.The Balance Time Limit: 5000MS Memory Limit...

POJ 题目分类

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj

POJ2142_The Balance_扩展欧几里得

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

POJ 题目分类

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj

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

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

POJ 题目分类

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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