poj2142-The Balance(扩展欧几里德算法)
一,题意:
有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品,
要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小。(注意:砝码位置有左右之分)。
二,思路:
1,砝码有左右位置之分,应对比两种情况
i,a左b右,得出方程 ax1 - by1 = d ;
ii,b左a右,得出方程 bx2 - ay2 = d 。
2,利用扩展欧几里德算法,解出(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2。
3,输出x1+y1和x2+y2 中的最小值。
三,步骤:
1,由题意得出两个方程
i,ax1 - by1 = d ;
ii,bx2 - ay2 = d 。
2,代入算法,解出两个方程的解(x1,y1)、(x2,y2),并求出最小x1和x2,以及相对应的y1,y2.
(详细步骤请参照本博客poj1061或者poj2115)。
3, 判断步骤
i,x1+y1最小时,输出x1,y1
ii,x2+y2最小时,输出y2,x2。 *此处为y2在前面输出,因为x2+y2最小时,第一个输入的a对应的是y2。
#include<iostream>
#include<cmath>
using namespace std; void exgcd(int a,int b,int& g,int& x,int& y){ //int& a 是定义一个存放整形变量a的地址
if(!b){ g = a ; x = ; y = ;} // g用来存储gcd(a,b)的值
else { exgcd(b , a%b , g , y , x) ; y -= x * (a/b) ; }
} void work(int a , int b , int d ,int& g , int& x , int& y){
exgcd(a,b,g,x,y); //此处的x,y接收 ax+by=gcd(a,b)的值
x *= d/g; //求ax+by=c 的解x
// y *= d/g; //求ax+by=c 的解y
int t = b/g;
x = (x%t + t) % t; //求出最小非负整数
y = abs( (a*x - d) / b); //求相对应的y,取绝对值是为了当左边砝码数 x 为零的时候,得出来的 y 是正整数。
/* //以下是先求y再求对应的x 。
int t = a/g;
y = (y%t + t) % t;
x = abs( (d + b*y) / a);
*/
} int main(){
int a,b,d,g,x1,x2,y1,y2;
while(cin>>a>>b>>d){
if(a==&&b==&&d==)break;
work(a,b,d,g,x1,y1);
work(b,a,d,g,x2,y2);
if( x1+y1 < x2+y2 )
cout<<x1<<" "<<y1<<endl;
else
cout<<y2<<" "<<x2<<endl; //(注意顺序)
}
return ;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
poj2142-The Balance(扩展欧几里德算法)的更多相关文章
- POJ2142 The Balance (扩展欧几里德)
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意 你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...
- POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)
题目链接:https://cn.vjudge.net/problem/POJ-2142 题意 自己看题吧,懒得解释 思路 第一部分就是扩展欧几里德 接下来是根据 $ x=x_0+kb', y=y_0- ...
- poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的
题目意思一开始没理解,原来是 给你重为a,b,的砝码 求测出 重量为d的砝码,a,b砝码可以无限量使用 开始时我列出来三个方程 : a*x+b*y=d; a*x-b*y=d; b*y-ax=d; 傻眼 ...
- (扩展欧几里德算法)zzuoj 10402: C.机器人
10402: C.机器人 Description Dr. Kong 设计的机器人卡尔非常活泼,既能原地蹦,又能跳远.由于受软硬件设计所限,机器人卡尔只能定点跳远.若机器人站在(X,Y)位置,它可以原地 ...
- 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd( ...
- poj2115-C Looooops(扩展欧几里德算法)
本题和poj1061青蛙问题同属一类,都运用到扩展欧几里德算法,可以参考poj1061,解题思路步骤基本都一样.一,题意: 对于for(i=A ; i!=B ;i+=C)循环语句,问在k位存储系统中循 ...
- poj1061-青蛙的约会(扩展欧几里德算法)
一,题意: 两个青蛙在赤道上跳跃,走环路.起始位置分别为x,y. 每次跳跃距离分别为m,n.赤道长度为L.两青蛙跳跃方向与次数相同的情况下, 问两青蛙是否有方法跳跃到同一点.输出最少跳跃次数.二,思路 ...
- HDU 1576 A/B 扩展欧几里德算法
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- ACM_扩展欧几里德算法
<pre name="code" class="cpp">/* 扩展欧几里德算法 基本算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表 ...
随机推荐
- 安卓微POS-PDA手持终端,支持离线在线联网销售开单;移动开单 盘点 功能
采购单.采购退货单 销售单.销售退货单.收款.优惠.赠品等操作实现盘点作业(多台设备同时作业,相同商品,数量累计) 现场打印票据 实现采购订单.采购单.采购退货单.销售订单.销售单.销售退货单验货没 ...
- junit单元测试中私有方法测试
1.单元测试可以对系统逻辑进行每个单元模块的测试. 2.单元测试也可以作为回归测试的依据,可以避免升级完善功能时引入问题. 3.单元测试要求将代码写的更清晰,更易于测试. 4.有时单元测试需要测试私有 ...
- Kafka 分布式消息队列介绍
Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...
- underscore.js依赖库函数分析二(查找)
查找: 在underscore.js封装了对dom查找的操作,find()和filter()函数,find()函数的查找操作是返回首个与条件相符的元素值,filter()函数是找到与条件相符的所有元素 ...
- Drawing Arc Using ArcSegment in XAML
We can use the Arc XAML element to draw arcs in XAML. Besides drawing arcs using the Arc element, we ...
- 使用CSS代码修改博客模板
在修改设置使公告栏里的头像更新为新的头像时发现里边还有“页面定制CSS代码”这一选项,查了一下发现这东西可以对页面做一些个性化的调整.正好目前我使用的这个模板标题和导航栏的字体实在难看,顺手修改了一下 ...
- Win10 利用安装盘启用 .NET Framework 3.5
以管理员身份运行命令提示符,在“管理员:命令提示符”窗口中输入以下命令:dism.exe /online /enable-feature /featurename:netfx3 /Source:D:\ ...
- ACM 兰州烧饼
兰州烧饼 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 烧饼有两面,要做好一个兰州烧饼,要两面都弄热.当然,一次只能弄一个的话,效率就太低了.有这么一个大平底锅,一 ...
- 使用AFNetworking 2.0 请求数据时出现错误 Request failed: unacceptable content-type: text/html 解决方法
使用AFNetworking 2.0 请求数据时出现错误 Request failed: unacceptable content-type: text/html 解决方法 添加一行 manager. ...
- bug:无法给图片加边框
一,经历 1.错误代码 _avatarView.layer.cornerRadius = GIFT_AVATAR_WIDTH * 0.5; _avatarView.layer.borderColor ...