UVA 11549 模拟 Floyed判圈法的应用 Calculator Conundrum
2014-09-09 17:37
274 查看
此题很容易想到会出现环,那么就可以想到用map来判重,但是此题还有一种更加优越的所需空间复杂度为o(1)的算法 。
#include<cstdio> #include<iostream> #include<map> #include<cmath> using namespace std; typedef long long LL; map<int,int> dic; int wei[10],tot,fans,n,k,T; inline int Next(int n,int k) { LL tmp = (LL)k*k; int d = log10(tmp)+1; int ans; if(d>n)ans = tmp / wei[d-n]; else ans = tmp; return ans; } /*int main() { freopen("a.in","r",stdin); scanf("%d",&T); wei[1]=10; for(int i=2;i<=9;i++)wei[i]=wei[i-1]*10; while(T--) { scanf("%d%d",&n,&k); dic.clear();tot=fans=0; while(dic[k]==0){ dic[k]=++tot; if(k>fans)fans=k; k=Next(n,k); } printf("%d\n",fans); } return 0; }*/ //Floyed判圈算法,空间复杂度降到O(1) //假象有两个小孩在一个有环的跑道上赛跑,其中一个小孩的速度是另一个小孩速度的两倍,跑得快的小孩一定能都追上跑的慢的小孩,根据这一点设计判圈的算法。 int main() { freopen("a.in","r",stdin); scanf("%d",&T); wei[1]=10; for(int i=2;i<=9;i++)wei[i]=wei[i-1]*10; while(T--) { scanf("%d%d",&n,&k); int ans = k; int k1 = k,k2 = k; do{ //小孩1每次走一步 k1 = Next(n,k1); //小孩2每次走两步 k2 = Next(n,k2);if(k2>ans)ans = k2; k2 = Next(n,k2);if(k2>ans)ans = k2; }while(k1!=k2); //两小孩相遇,即为圈 printf("%d\n",ans); } return 0; }
相关文章推荐
- UVA 11549 - Calculator Conundrum(模拟+周期规律)
- UVa 11549 - Calculator Conundrum(模拟)
- Uva11549 模拟判断有环的问题 Floyd判圈算法
- uva 11549 - Calculator Conundrum(模拟)
- uva 11549 - Calculator Conundrum 模拟
- php curl函数应用方法之模拟浏览器
- 使用UI Automation实现自动化测试--6 (模拟鼠标在自动化测试中的应用)
- 模拟请求初步应用,制作网页游戏辅助程序(开心网争车位、咬人、买房子、虚拟朋友、礼物)
- C#枚举,继承的应用-模拟动物的,青蛙,狗都继承动物
- C# : 模拟请求初步应用,制作网页游戏辅助程序(开心网争车位、咬人、买房子、虚拟朋友、礼物)
- php curl函数应用方法之模拟浏览器
- 模拟电子技术16 29------——放大电路 动态分析 微变等效电路 应用
- FLEX实践—Datagrid 高级应用(模拟EBS Folder功能)
- 使用UI Automation实现自动化测试--7.1 (模拟键盘输入数据在自动化测试中的应用)
- android 应用模拟按键
- 综合应用WPF/WCF/WF/LINQ之三十四:在XBAP项目中模拟弹出一个自定义的“模态窗口”
- 模拟请求初步应用,制作网页游戏辅助程序(开心网争车位、咬人、买房子、虚拟朋友、礼物)
- 使用UI Automation实现自动化测试--7.2 (模拟键盘复杂操作在自动化测试中的应用)
- php curl函数应用方法之模拟浏览器
- javascript模拟dotNet中的StreamBuild及应用