题目链接:点击查看

题目大意:给出两种重量的砝码,我们需要利用天平称出指定重量的药物,我们需要求出这两种砝码各自的数量,使得砝码数量之和最小

题目分析:我们可以先列出关系式,假设两个砝码的重量分别为a和b,我们需要秤的药物重量为c,那么我们可以得出关系式a*x+b*y=c,用扩展欧几里得可以算出x和y,然后我们分两种情况讨论:

  1. 求x是作为解的最小正整数,即需要x个重量为a的砝码放在天平左边,此时

    1. 若计算出y>0,说明需要y个重量为b的砝码放在左边
    2. 若计算出y<0,说明需要y个重量为b的砝码放在右边
  2. 求y是作为解的最小正整数,即需要y个重量为b的砝码放在天平左边,此时
    1. 若计算出x>0,说明需要x个重量为a的砝码放在左边
    2. 若计算出x<0,说明需要x个重量为a的砝码放在右边

这样分类讨论一下答案就出来了,最后比较一下abs(x1)+abs(y1)和abs(x2)+abs(y2)的大小,然后输出答案即可

代码:

#include<iostream>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=70;int ex_gcd(int a,int b,int &x,int &y)
{if(b==0){x=1;y=0;return a;}int ans=ex_gcd(b,a%b,y,x);y-=a/b*x;return ans;
}int main()
{
//  freopen("input.txt","r",stdin);int a,b,c;while(scanf("%d%d%d",&a,&b,&c)!=EOF&&a+b+c){int x,y;int d=ex_gcd(a,b,x,y);//d为a和b的最大公约数
//因为题目保证一定有解,所以c%d一定等于0a/=d;b/=d;c/=d;ex_gcd(a,b,x,y);//计算出ax+by=1的解
//因为我们计算的是ax+by=1的x和y,所以在等式两边需要再乘上c才行int x1=x*c;//第一种情况x1=(x1%b+b)%b;int y1=(c-x1*a)/b;if(y1<0)y1=-y1;int y2=y*c;//第二种情况y2=(y2%a+a)%a;int x2=(c-y2*b)/a;if(x2<0)x2=-x2;if(x1+y1>x2+y2)printf("%d %d\n",x2,y2);elseprintf("%d %d\n",x1,y1);}return 0;
}

POJ - 2142 The Balance(扩展欧几里得)相关推荐

  1. POJ - 2115 C Looooops(扩展欧几里得)

    题目链接:点击查看 题目大意:执行一个循环: for (variable = A; variable != B; variable += C) statement; 问在2的k次幂的范围内最少需要执行 ...

  2. POJ 2115 C Looooops(扩展欧几里得)

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) {if (b == 0) return a;return gcd(b, a % ...

  3. POJ 2142 The Balance(扩展欧几里德)

    The Balance 由题意可得: {ax1−by1=dbx2−ay2=d\begin{cases}ax_1 - by_1 = d \\\\ bx_2 - ay_2 = d\end{cases}⎩⎪ ...

  4. POJ 2142——扩展欧几里得

    题目是很裸的扩展欧几里得,但是对x,y有限制条件,要求所有x,y中abs(x)+abs(y)最小,在这个条件下要求abs(a* x)+abs(b* y)最小 显然我们需要用扩展欧几里得求得一组解,问题 ...

  5. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  6. POJ - 1061 青蛙的约会(扩展欧几里得)

    题目链接:点击查看 题目大意:两只青蛙在一个单向循环数轴上跳动,给出初始位置和每秒跳动的距离以及数轴长度,问是否可以相遇,若能相遇求出最小时间 题目分析:自从第一次接触扩展欧几里得以来已经有半年时间了 ...

  7. POJ 1061扩展欧几里得

    扩展欧几里得的模板题,需要注意的是为了得到一个最小正数解我们要使ax+by=c中的a,b都是正数 #include<cstdio> #include<cstring> #inc ...

  8. POJ 1061 青蛙的约会 (扩展欧几里得)

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 97673   Accepted: 18409 Descripti ...

  9. poj-青蛙的约会(扩展欧几里得)nyoj-小柯的约会

    由题意可列出方程 x + m * s - (y + n * s) = k * l; 化简得   (n-m)*s + k*l = x - y 化简得   (n-m)*s = x - y (mod l); ...

最新文章

  1. Coredata — 入门使用
  2. 8-7复习 stl常用算法
  3. 泛函p121可分Hilbert空间都同构于l^2
  4. ES6对象(2):面向对象与类
  5. 附加作业:源自刘乾老师的问题
  6. Java面试题,java工程师求职简历
  7. ftp服务器PDF文件在线查看
  8. 内存溢出,频繁full gc 处理思路
  9. printf 规定数据输出方式
  10. 开发者点评GitHub 暗黑模式:太暗了
  11. 剑指Offer学习笔记(3)——解决面试题的思路
  12. 传智播客 C/C++学习笔记 野指针
  13. 关于linux无法联网以及xshell无法连接linux的解决
  14. CSDN看不见博主博客的评论_解决办法(亲测有效奥)
  15. Java实现选择排序和冒泡排序
  16. rem 用户改变字体大小_用户可以更改字体大小
  17. 使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具
  18. 使用FontCreator打造属于自己的字体
  19. C#爬虫 音娱吉他文本和弦谱
  20. Wootrade 评级报告:B,展望稳定 | TokenInsight

热门文章

  1. MySQL高级 - 索引的使用 - 覆盖索引
  2. The pc Register(程序计数器)
  3. 排序、翻页、函数计算问题
  4. Spring容器初始化实现V3 版本
  5. SpringMVC拦截器-快速入门(应用)
  6. Spring系列之BeanPostProcessor分析
  7. HDFS的API操作-访问权限问题
  8. 后台服务系统之Dubbo Admin的讲解
  9. spring事务管理-Transaction模板(了解)
  10. 模板方法源码解析(jdk+servlet+mybatis)