热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ1061青蛙的约会欧几里德扩展

原题:http:poj.orgproblem?id1061题目:青蛙的约会TimeLimit:1000MSMemoryLimit:10000KTot

原题: http://poj.org/problem?id=1061


题目:

青蛙的约会
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 98013 Accepted: 18550
Description

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。
我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
Input

输入只包括一行5个整数x&#xff0c;y&#xff0c;m&#xff0c;n&#xff0c;L&#xff0c;其中x≠y <2000000000&#xff0c;0 Output

输出碰面所需要的跳跃次数&#xff0c;如果永远不可能碰面则输出一行”Impossible”
Sample Input

1 2 3 4 5
Sample Output

4


思路&#xff1a;

对于这个题&#xff0c;我们可以看成一个追击问题&#xff0c;假设其中一个人是不动的&#xff0c;那么另一个相对它的速度就是n-m&#xff0c;而最初的路径差是x-y&#xff0c;我们要求的就是在最快的时间让他们相遇。

我们可以建立这样的线性方程&#xff1a;速度 * 次数 - 圈数 * 周长&#61;距离
然后我们用扩展欧几里德算法就可以解出这个方程&#xff0c;并求得最小的次数。


代码&#xff1a;

#include"cstdio"
#include"iostream"
using namespace std;
typedef long long int lint;lint gcd(lint a,lint b)
{if(b&#61;&#61;0) return a;return gcd(b,a%b);
}
//ax&#43;by&#61;gcd(a,b)&#61;c
void exgcd(lint a,lint b,lint &x,lint &y)
{if(b&#61;&#61;0){x&#61;1;y&#61;0;return ;}exgcd(b,a%b,x,y);lint t&#61;x;x&#61;y;y&#61;t-y*(a/b);
}int main()
{//freopen("in.txt","r",stdin);lint m,n,x,y,l;while(scanf("%I64d %I64d %I64d %I64d %I64d",&x,&y,&m,&n,&l)!&#61;EOF){//建立方程 速度*次数-圈数*周长&#61;距离lint a&#61;(n-m&#43;l)%l;lint b&#61;l;lint c&#61;(x-y&#43;l)%l;lint g&#61;gcd(a,b);//扩展欧几里得方程 必须满足ax&#43;by&#61;gcd(a,b)才有解if(c%g){printf("Impossible\n");continue;}//约分a&#61;a/g;b&#61;b/g;c&#61;c/g; //倍数//分别记录次数和圈数lint ans,q;//解线性方程ax&#43;by&#61;1exgcd(a,b,ans,q);//c*ans为真正的总次数&#xff08;还原约分&#xff09;//如果跑过了 周长 次&#xff0c;就跑过了 周长*速度 米//那么就跑过了 速度 圈&#xff0c;这多了一个周期不是最优解ans&#61;c*ans%b;//欧几里得方程求出的结果可能小于0//那我们就多跑一个周期if(ans<0) ans&#61;ans&#43;b;printf("%I64d\n",ans);}return 0;
}

推荐阅读
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球 Tetris 高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 信用评分卡的Python实现与评估
    本文介绍如何使用Python构建和评估信用评分卡模型,涵盖数据预处理、模型训练及验证指标选择。附带详细代码示例和视频教程链接。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 解决C++编译错误C3867的方法
    本文详细介绍了在不同版本的Visual Studio中,如何正确处理成员函数指针以避免编译错误C3867。同时,提供了一个具体的代码示例及其优化方案。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • jQuery HooRay:一款自创的实用 jQuery 工具插件
    这款插件主要由作者在工作中积累的常用功能开发而成,旨在解决现有插件间的冲突及浏览器兼容性问题。通过整合和优化现有插件,确保其稳定性和高效性。 ... [详细]
  • 选择适合生产环境的Docker存储驱动
    本文旨在探讨如何在生产环境中选择合适的Docker存储驱动,并详细介绍不同Linux发行版下的配置方法。通过参考官方文档和兼容性矩阵,提供实用的操作指南。 ... [详细]
author-avatar
40740
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有