POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)
题目链接:https://cn.vjudge.net/problem/POJ-2142
题意
自己看题吧,懒得解释
思路
第一部分就是扩展欧几里德
接下来是根据 $ x=x_0+kb', y=y_0-ka' $
其中 $ a'=\frac{a}{gcd(a, b)}, b'=\frac{b}{gcd(a, b)} \(
来最下化这两个式子:
\) |x|+|y| \(
\) |ax|+|by| $
那么回想高中不等式的学习,我们可以通过画图来解决这个最小化问题
可以发现在$ x<0 $或 $ y<0 $的情况下,曼哈顿距离递增,那么绝对值和的最小值就存在与轴的附近
代码
#include <cstdio>
#define abs(x) (((x)>0)?(x):(-x))
void exgcd(int a, int b, int &d, int &x, int &y){
if (b==0) {d=a; x=1; y=0;}
else {exgcd(b, a%b, d, y, x); y-=x*(a/b);}
}
int main(void){
int a, b, c;
while (scanf("%d%d%d", &a, &b, &c)==3 && a){
int x, y, d;
exgcd(a, b, d, x, y);
a/=d; b/=d; c/=d;
x*=c; y*=c;
int ax, ay, bx, by;
ax=(x%b+b)%b;
ay=(c-a*ax)/b;
by=(y%a+a)%a;
bx=(c-b*by)/a;
// printf("%d %d||%d %d||%d %d\n", x, y, ax, ay, bx, by);
if (abs(ax)+abs(ay)<abs(by)+abs(bx))
printf("%d %d\n", abs(ax), abs(ay));
else if (abs(ax)+abs(ay)>abs(by)+abs(bx))
printf("%d %d\n", abs(bx), abs(by));
else if (a*abs(ax)+b*abs(ay)>b*abs(by)+a*abs(bx))
printf("%d %d\n", abs(bx), abs(by));
else printf("%d %d\n", abs(ax), abs(ay));
}
return 0;
}
Time | Memory | Length | Lang | Submitted |
---|---|---|---|---|
None | 132kB | 930 | C++ | 2018-05-12 23:56:52 |
POJ-2142 The Balance 扩展欧几里德(+绝对值和最小化)的更多相关文章
- POJ 2142 - The Balance [ 扩展欧几里得 ]
题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...
- POJ.2142 The Balance (拓展欧几里得)
POJ.2142 The Balance (拓展欧几里得) 题意分析 现有2种质量为a克与b克的砝码,求最少 分别用多少个(同时总质量也最小)砝码,使得能称出c克的物品. 设两种砝码分别有x个与y个, ...
- POJ 2142 The Balance【扩展欧几里德】
题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...
- POJ - 2142 The Balance(扩展欧几里得求解不定方程)
d.用2种砝码,质量分别为a和b,称出质量为d的物品.求所用的砝码总数量最小(x+y最小),并且总质量最小(ax+by最小). s.扩展欧几里得求解不定方程. 设ax+by=d. 题意说不定方程一定有 ...
- POJ2142 The Balance (扩展欧几里德)
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意 你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...
- poj2142-The Balance(扩展欧几里德算法)
一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...
- POJ 2142 The Balance (解不定方程,找最小值)
这题实际解不定方程:ax+by=c只不过题目要求我们解出的x和y 满足|x|+|y|最小,当|x|+|y|相同时,满足|ax|+|by|最小.首先用扩展欧几里德,很容易得出x和y的解.一开始不妨令a& ...
- poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的
题目意思一开始没理解,原来是 给你重为a,b,的砝码 求测出 重量为d的砝码,a,b砝码可以无限量使用 开始时我列出来三个方程 : a*x+b*y=d; a*x-b*y=d; b*y-ax=d; 傻眼 ...
- poj 2115 C Looooops 扩展欧几里德
C Looooops Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 23616 Accepted: 6517 Descr ...
随机推荐
- JavaScript学习——JS对象和全局函数
1. Array对象 数组的特点:长度可变!数组的长度=最大角标+1 2.Boolean对象 如果value 不写,那么默认创建的结果为false 3.Date对象 getTime()返回1970年1 ...
- HDU 1506 Largest Rectangle in a Histogram【DP】
题意:坐标轴上有连续的n个底均为1,高为h[i]的矩形,求能够构成的最大矩形的面积. 学习的别人的代码 @_@ 看底的坐标怎么找的看了好一会儿--- 记l[i]为矩形的底的左边的坐标,就将它一直向左扩 ...
- SP10628 COT - Count on a tree 主席树
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<string> ...
- 版本号比较[versionCompare]
/*** * 版本号比较 * @param v1 版本号a * @param v2 版本号b * @return -1代表不是合格版本号:0代表一样大.1 代表版本号a大于版本号b.2代表版本号b大于 ...
- UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化
题目链接:https://cn.vjudge.net/problem/UVA-1331 题意 给一个任意多边形,把它分为多个三角形. 求某方案中最大的三角形是各方案中最小的面积的三角形面积. 思路 学 ...
- /etc/rc.d/rc.sysinit
[root@web02 ~]# ls /etc/rc.d/rc.sysinit /etc/rc.d/rc.sysinit [root@web02 ~]# [root@web02 ~]# ls /etc ...
- Docker学习总结(9)——Docker常用命令
容器生命周期管理 - docker [run|start|stop|restart|kill|rm|pause|unpause] 容器操作运维 - docker [ps|inspect|top|att ...
- Android开发学习之事件处理和Button具体解释
Android的事件处理机制: 1.基于监听器的事件处理 --- 组件绑定特定的事件监听器 --- 重点 2.基于回调的事件处理 --- 主要做法是重写Android组件特定的回调函数, ...
- zoj_3657,12年长春站c题,模拟
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> us ...
- litepal更好的操作sqlite3,配置与基本操作
litepal更好的操作sqlite3 配置 在app下的build.gradle中加入 创建litepal.xml配置 在app/src/main下面创建assets,新建litepal.xml & ...