uva 11549计算器谜题(floyd判圈算法)
来源:互联网 发布:java byte 表示0xff 编辑:程序博客网 时间:2024/05/29 12:52
题意:有个老式计算器,每次只能记住一个数字的前n位。现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少。例如,n=1,k=6,那么一次显示:6,3,9,1...思路:这个题一定会出现循环,所以一个个模拟,遇到相同的就再之前所有数中找最大的输出即可。
最容易想到的就是set判重,一开始k直接生算每次除十......超时
然后看了书,用string,ac,很方便但是时间达到了4s,果然string和stringstream好慢啊.........
又改成了记录k*k的每一位,时间为1s
最后用了floyd判圈算法,0.5s,空间复杂度为o(1)........果然神奇
先上set代码:
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string>#include<map> #include<set>#include<sstream>using namespace std; #define LL long long //const int maxn = ;const int INF = 1000000000;//freopen("input.txt", "r", stdin);int buf[100];LL next(LL n, LL k) {stringstream ss;ss << k * k;string s = ss.str();if(s.length() > n) s = s.substr(0, n);LL ans;stringstream ss2(s);ss2 >> ans;return ans; }int main() {int t; scanf("%d", &t);while(t--) {set<LL> a;LL n, k; scanf("%lld%lld", &n, &k);LL ans = 0;while(!a.count(k)) {a.insert(k);ans = max(ans, k);k = next(n, k);}printf("%lld\n", ans);}return 0;}
然后是floyd判圈代码
#include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<string>#include<map> #include<set>#include<sstream>using namespace std; #define LL long long //const int maxn = ;const int INF = 1000000000;//freopen("input.txt", "r", stdin);int buf[100];LL next(LL n, LL k) {if(!k) return 0;LL k2 = (LL)k * k;int L = 0;while(k2 > 0) {buf[L++] = k2 % 10; k2 /= 10;}if(n > L) n = L;int ans = 0;for(int i = 1; i < n; i++) ans = ans * 10 +buf[--L];return ans;}int main() {int t; scanf("%d", &t);while(t--) {int n, k;cin >> n >> k;int ans = k;int k1 = k, k2 = k;do {k1 = next(n, k1);k2 = next(n, k2); if(k2 > ans) ans = k2;k2 = next(n, k2); if(k2 > ans) ans = k2;} while(k1 != k2);cout << ans << endl;}return 0;}
0 0
- uva 11549计算器谜题(floyd判圈算法)
- 暴力,STL,哈希技术,Floyd判圈算法(计算器谜题,uva 11549)
- floyd判圈算法 (UVA 11549 - Calculator Conundrum)
- uva 11549(floyd判圈)
- UVa 11549 计算器迷题(判重和Folyd判圈算法)
- UVA11549 计算机谜题(Floyd判圈算法)
- UVA 11549 Calculator Conundrum Floyd判圈算法 Brent判圈算法 相关性质及证明
- UVA 11549 Calculator Conundrum (Floyd判圈算法)
- UVa 11549 Calculator Conundrum / floyd判圈算法
- UVA 11549 Calculator Conundrum (Floyd判圈算法)
- UVA 11549 Calculator Conundrum Floyd判圈算法 .
- uva11549 老式计算器 (Floyd判圈 )
- uva 11549 Calculator Conundrum(floyd判圈)
- UVA 11549 Calculator Conundrum Floyd判圈
- Floyd判圈算法
- Floyd判圈算法
- floyd判圈算法
- Floyd判圈算法
- java中反向循环
- 一道试题引发的血案
- 用Xcode 进行Flappy bird 的iOS开发(3)
- 范建震(Hand-CEO):汉得的成功源于运气——访谈录
- 17.picker view的基本使用
- uva 11549计算器谜题(floyd判圈算法)
- 点派生直线类
- camera video数据流
- 【记录】Intent和Activity的学习
- linux下eclipse编译C++ 11版本
- x-code中蓝色文件夹和绿色文件夹的区别
- android 开发小笔记
- 高级部分(百度地图一)
- model跟view的关系