[UVa 11549]Calculator Conundrum

题解

显然按题意模拟会出现环,因为可能出现的数字数有限的,所以不可能无限的衍生下去。

那么我们就可以按题意模拟,遍历整个过程,统计最大值即可。

判环的环我们想到$hash$,也可以用$STL$中的$set$,但是复杂度高...

$Floyd$判圈。一步两步法,有环的话肯定会相遇,空间复杂度可以降到$O(1)$,时间也快不少。

 1 //It is made by Awson on 2017.9.18
 2 #include <map>
 3 #include <set>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <queue>
 7 #include <stack>
 8 #include <cstdio>
 9 #include <string>
10 #include <vector>
11 #include <cstdlib>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #define LL long long
16 #define Max(a, b) ((a) > (b) ? (a) : (b))
17 #define Min(a, b) ((a) < (b) ? (a) : (b))
18 #define Abs(a) ((a) < 0 ? (-(a)) : (a))
19 using namespace std;
20
21 int n;
22 LL lim, k;
23
24 LL getnext(LL x) {
25     x *= x;
26     while (x/lim) x /= 10;
27     return x;
28 }
29
30 int main() {
31     int t;
32     scanf("%d", &t);
33     while (t--) {
34         scanf("%d%lld", &n, &k);
35         lim = 1;
36         LL ans = k;
37         for (int i = 1; i <= n; i++)
38             lim *= 10;
39         LL k1 = k, k2 = k;
40         do {
41             k1 = getnext(k1); ans = Max(ans, k1);
42             k2 = getnext(k2); ans = Max(ans, k2);
43             k2 = getnext(k2); ans = Max(ans, k2);
44         }while (k2 != k1);
45         printf("%lld\n", ans);
46     }
47     return 0;
48 }
时间: 2024-10-11 11:36:03

[UVa 11549]Calculator Conundrum的相关文章

[2016-03-19][UVA][11549][Calculator Conundrum]

时间:2016-03-19 21:27:43 星期六 题目编号:[2016-03-19][UVA][11549][Calculator Conundrum] 题目大意:给定数k每次取前n位不断平方,求出现的最大值是多少 方法: 方法1:模拟一遍过程,直到出现循环 方法2:Floyd判断算法,定义两个k,每次k1走一次,k2走两次,知道k1,k2相同 方法1:STL超级暴力方法 方法2:小小优化版 方法3:Floyd判圈算法 方法1:STL超级暴力方法 #include <set> #inclu

UVA 11549 Calculator Conundrum Floyd判圈

题目链接:点击打开链接 题意: 输入n k,表示计算器能显示n位数字,初始有一个数字k 每次操作 k = k^2, 若超出n位则截取前n位. 求能获得的最大数字. 思路: 首先我们能判断这个操作一定存在循环. 那么如何终止循环,利用Floyd判圈法 让两个循环child1和child2刚开始都为k,然后child1每次变换一次,child2每次变换2次: 这样当child1再次等于child2时说明已经至少经过一个循环节了,因为child2已经从后面赶上child1了 import java.i

UVA之11549 - Calculator Conundrum

[题目] Problem C CALCULATOR CONUNDRUM Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with the following time waster. She enters a number k then repeatedly squares it until the result overflows. When the

C - Calculator Conundrum

uva 11549 题意:你拥有一个老式计算机,它只能显示n为数字,有一天你输入数字k,接着一直平方下去,在这个过程中如果数字长度大于n,那么截取前n个数形成一个新的数k,再用这个新的数k一直平方下去,那么这个过程中能显示的最大数字是多少. 思路:在这个过程如果出现了以前出现过的数,那么从第一个开始到这个数就是一个循环节,后面的也与这个节一模一样,因为都是针对一个数字执行同一种操作. 为了时间复杂度上的考虑,可以使用set判重,耗时2.279s #include <iostream> #inc

uva 11549

/**  * @brief uva 11549  * @file 11549.cpp  * @author mianma  * @created 2014/12/31 11:43  * @edited  2014/12/31 11:43  * @type   * @note floyd判圈算法  */ #include <fstream> #include <iostream> #include <cstring> #include <cmath> usin

UVa11549:Calculator Conundrum

UVa11549:Calculator Conundrum 题目大意 有一个老旧的计算器只能显示前n个数字.现在给定一个数字k,每次给k平方,如果答案长度超过n则从最高位开始显示n个数字,丢弃其余数字. 要求:求出计算器能显示的最大数字. Solution1(naive) 本题中得到的数列会出现循环,可以用一个set记录所有得到的数字,一旦出现重复数字停止循环,输出set中的最大值即可. AC-Code(C++) Time:540ms #include <iostream> #include

Designing Efficient Algorithms [Examples]~C - Calculator Conundrum

Alice got a hold of an old calculator that can display n digits. She was bored enough to come up with the following time waster. She enters a number k then repeatedly squares it until the result overflows. When the result overflows, only the n most s

uva 11549计算器谜题(floyd判圈算法)

 题意:有个老式计算器,每次只能记住一个数字的前n位.现在输入一个整数k,然后反复平方,一直做下去,能得到的最大数是多少.例如,n=1,k=6,那么一次显示:6,3,9,1... 思路:这个题一定会出现循环,所以一个个模拟,遇到相同的就再之前所有数中找最大的输出即可. 最容易想到的就是set判重,一开始k直接生算每次除十......超时 然后看了书,用string,ac,很方便但是时间达到了4s,果然string和stringstream好慢啊......... 又改成了记录k*k的每一位,

UVa 11549 计算器谜题(Floyd判圈算法)

https://vjudge.net/problem/UVA-11549 题意: 有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位.如果一直这样做下去,能得到的最大数是多少? 思路: 这个肯定是会循环的. 比较普通的做法就是用set来判断是否出现过来终止循环. 另一个高效算法:Floyd判圈算法!! 想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍.如果跑到是直的,跑得快的小孩永远