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


    https://vjudge.net/problem/UVA-11549

    题意:

    有一个老式计算器,只能显示n位数字,输入一个整数k,然后反复平方,如果溢出的话,计算器会显示结果的最高n位。如果一直这样做下去,能得到的最大数是多少?

    思路:

    这个肯定是会循环的。

    比较普通的做法就是用set来判断是否出现过来终止循环。

    另一个高效算法:Floyd判圈算法!!

    想象一下,假设有两个小孩子在一个“可以无限向前跑”的跑道上赛跑,同时出发,但其中一个孩子的速度是另一个两倍。如果跑到是直的,跑得快的小孩永远在前面,但如果跑道有环,则跑得快的小孩将“追上”跑得慢的小孩。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cstdio>
     5 #include<vector>
     6 #include<stack>
     7 #include<queue>
     8 #include<cmath>
     9 #include<map>
    10 using namespace std;
    11 
    12 int n,k;
    13 
    14 int next(int n,int k)
    15 {
    16     int buf[105];
    17     if(!k)  return 0;
    18     int cnt=0;
    19     long long k2=(long long)k*k;
    20     while(k2)   {buf[cnt++]=k2%10;k2/=10;}
    21     if(n>cnt)   n=cnt;
    22     int ans=0;
    23     for(int i=0;i<n;i++)
    24         ans=ans*10+buf[--cnt];
    25     return ans;
    26 }
    27 
    28 int main()
    29 {
    30     //freopen("D:\input.txt","r",stdin);
    31     int T;
    32     scanf("%d",&T);
    33     while(T--)
    34     {
    35         scanf("%d%d",&n,&k);
    36         int ans=k;
    37         int k1=k,k2=k;
    38         do
    39         {
    40             k1=next(n,k1);  ans=max(ans,k1);
    41             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第一步
    42             k2=next(n,k2);  ans=max(ans,k2);   //小孩2,第二步
    43         }while(k1!=k2);  //追上以后才停止
    44         printf("%d
    ",ans);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    P4005 小 Y 和地铁
    P1039 侦探推理
    P2766 最长不下降子序列问题
    P2312 解方程
    P2169 正则表达式
    UOJ#22. 【UR #1】外星人
    UOJ#21. 【UR #1】缩进优化
    Palindromeness CodeChef
    bzoj5392 [Lydsy1806月赛]路径统计
    997D Cycles in product
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6784786.html
Copyright © 2020-2023  润新知