题目链接: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 扩展欧几里德(+绝对值和最小化)的更多相关文章

  1. POJ 2142 - The Balance [ 扩展欧几里得 ]

    题意: 给定 a b n找到满足ax+by=n 的x,y 令|x|+|y|最小(等时令a|x|+b|y|最小) 分析: 算法一定是扩展欧几里得. 最小的时候一定是 x 是最小正值 或者 y 是最小正值 ...

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

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

  3. POJ 2142 The Balance【扩展欧几里德】

    题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为c的物品,要求a的数量x和b的数量y最小,以及x+y的值最小. 用扩展欧几里德求ax+by=c,求出ax+by=1的一组通解,求出当 ...

  4. POJ - 2142 The Balance(扩展欧几里得求解不定方程)

    d.用2种砝码,质量分别为a和b,称出质量为d的物品.求所用的砝码总数量最小(x+y最小),并且总质量最小(ax+by最小). s.扩展欧几里得求解不定方程. 设ax+by=d. 题意说不定方程一定有 ...

  5. POJ2142 The Balance (扩展欧几里德)

    本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia The Balance 题目大意  你有一个天平(天平左右两边都可以放砝码)与重量为a,b(1<= ...

  6. poj2142-The Balance(扩展欧几里德算法)

    一,题意: 有两个类型的砝码,质量分别为a,b;现在要求称出质量为d的物品, 要用多少a砝码(x)和多少b砝码(y),使得(x+y)最小.(注意:砝码位置有左右之分). 二,思路: 1,砝码有左右位置 ...

  7. POJ 2142 The Balance (解不定方程,找最小值)

    这题实际解不定方程:ax+by=c只不过题目要求我们解出的x和y 满足|x|+|y|最小,当|x|+|y|相同时,满足|ax|+|by|最小.首先用扩展欧几里德,很容易得出x和y的解.一开始不妨令a& ...

  8. poj2142 The Balance 扩展欧几里德的应用 稍微还是有点难度的

    题目意思一开始没理解,原来是 给你重为a,b,的砝码 求测出 重量为d的砝码,a,b砝码可以无限量使用 开始时我列出来三个方程 : a*x+b*y=d; a*x-b*y=d; b*y-ax=d; 傻眼 ...

  9. poj 2115 C Looooops 扩展欧几里德

    C Looooops Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23616   Accepted: 6517 Descr ...

随机推荐

  1. vue+Element实现tree树形数据展示

    组件: Element(地址:http://element.eleme.io/#/zh-CN/component/tree):Tree树形控件 <el-tree ref="expand ...

  2. MVC 设计模式

    MVC 设计模式: 最早由 Trygve Teenskaug 在 1978 年提出,上世纪 80 年代是程序语言 Smalltalk 的一种内部架构.后来 MVC 被其他领域借鉴,成为了软件工程中的一 ...

  3. Unknown column 't_user.id' in 'where clause'(通过字段名删除不了数据)

    创建员工信息表t_user CREATE TABLE t_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) , passwor ...

  4. python中*号用法总结

    python 中有很多地方用到星号,有时候会想知道这个*是干嘛用的,总结如下,有不当之处,还望不吝指出,谢谢.1.乘法: 在很多时候是用作乘法的,例如: In [90]: 2*7 Out[90]: 1 ...

  5. POJ1743Musical Theme(后缀数组+二分)

    题意 有N(1 <= N <=20000)个音符的序列来表示一首乐曲,每个音符都是1..88范围内的整数,现在要找一个重复的主题.“主题”是整个音符序列的一个子串,它需要满足如下条件: 1 ...

  6. mysql 定时每秒插入一条数据

    1.创建表 2.创建存储过程 CREATE PROCEDURE user()INSERT INTO user(name,sex) VALUES ('1111','1'); 3.创建定时器 CREATE ...

  7. OpenResty.spec

    Name: openresty Version: 1.13.6.1 Release: 2%{?dist} Summary: OpenResty, scalable web platform by ex ...

  8. 【codeforces 29B】Traffic Lights

    [题目链接]:http://codeforces.com/problemset/problem/29/B [题意] 一辆车; 让从A开到B; 然后速度是v; (只有在信号灯前面才能停下来..否则其他时 ...

  9. CodeForces - 552E Vanya and Brackets

    Vanya and Brackets Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u ...

  10. POJ 1975 Median Weight Bead

    Median Weight Bead Time Limit: 1000ms Memory Limit: 30000KB This problem will be judged on PKU. Orig ...