热门标签 | 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;
}

推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • 本文介绍如何在 Android 中通过代码模拟用户的点击和滑动操作,包括参数说明、事件生成及处理逻辑。详细解析了视图(View)对象、坐标偏移量以及不同类型的滑动方式。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
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社区 版权所有