UVA 11549 模拟 Floyed判圈法的应用 Calculator Conundrum

来源:互联网 发布:ubuntu 查看32 64 编辑:程序博客网 时间:2024/06/07 09:37

此题很容易想到会出现环,那么就可以想到用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;}


0 0