《算法竞赛-训练指南》第一章-1.19_UVa 11549

来源:互联网 发布:ipad版淘宝怎么开店 编辑:程序博客网 时间:2024/06/06 10:52

这是道比较简单的题目,主要就是hash范围大,自己没有办法解决,但其实也是可以解决的,用map,或者什么的,都可以解决,但是自己就是没有好好的去想。

简单的hash大数据,如果是key是int类型的话,直接用个set表就行。

然后其余的处理其实真的很简单。但就是自己不努力思考导致的。

简单的介绍下这道题目的意思:一个旧电脑,屏幕只能显示N个数字,现在给你一个数字,每次求平方,溢出就只要最大的前N位,继续平方,问你,求得的最大的N位数字是多大。


很简单,不过就是hash的时候可能出些问题,但那都是小问题。然后就是方法的选取,题解中给了一个Floyd法判圈,这个算法题解是这样解释的。有两个小孩子比赛跑步,一个小孩子比另一个小孩跑的快,如果有环的话快的小孩就肯定能够追赶上慢的小孩,两者就相遇了。

但是其实有个这么个问题,我们应该使快的小孩的速度多快呢?是越快越好么?答案肯定不是的,事实上,笔者编程验证了,也不是这样的,当然你如果举一个很大的环,很大很大,那确实速度快的确实好,但是对于计算机来说,你的足够大,得很大很大才能体现出快,而且速度快,相遇可就难了,有时候一圈跑下来,没有相遇,那不就完蛋了么?(相遇规定为,小孩正好跑完完整的速度,即加入3M/s,你就得最少跑完3M之后再谈论相遇)

这个思想好,好在我之前没有接触过,现在接触到了。


贴出代码:

#include <stdio.h>#include <string.h>#include <iostream>#include <string>using namespace std;int N, K;int next(int k){long long ans = (long long)k * k;int buf[22];int cnt = 0;while (ans){buf[cnt++] = ans % 10;ans /= 10;}int L = cnt - 1;if (cnt > N){cnt = N;}int sum = 0;for (int i = 0; i < cnt; i++){sum = sum * 10 + buf[L--];}return sum;}int main(){int T;scanf("%d", &T);while (T--){scanf("%d%d", &N, &K);int k1 = K;int k2 = K;int ans = K;do{k1 = next(k1);k2 = next(k2);if (ans < k2){ans = k2;}k2 = next(k2);if (ans < k2){ans = k2;}} while (k1 != k2);printf("%d\n", ans);}//system("pause");return 0;}


原创粉丝点击