UVA11549 计算机谜题(Floyd判圈算法)

来源:互联网 发布:暗黑团队毁魔兽 知乎 编辑:程序博客网 时间:2024/06/05 05:38
 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #include<set> 7 #include<sstream> 8 using namespace std; 9 /*int next1(int n,int k)10 {11     stringstream ss;12     ss<<(long long)k*k;13     string s=ss.str();14     if(s.length()>n)s=s.substr(0,n);//结果太长,只取前n位15     int ans;16     stringstream ss2(s);17     ss2>>ans;18     return ans;19 }*/20 int buf[100];21 int next2(int n,int k)22 {23     if(!k) return 0;24     long long k2=(long long)k*k;25     int L=0;26     while(k2>0){27         buf[L++]=k2%10;k2/=10;28     }29     if(n>L)n=L;30     int ans=0;31     for(int i=0;i<n;i++)32     ans=ans*10+buf[--L];//把前min{n,L}位重新组合33     return ans;34 }35 /*int main()36 {37     int T;38     cin>>T;39     while(T--)40     {41         int n,k;42         cin>>n>>k;43         set<int>s;44         int ans=k;45         while(!s.count(k))46         {47             s.insert(k);48             if(k>ans)ans=k;49             k=next1(n,k);50         }51         cout<<ans<<endl;52     }53     return 0;54 }55 */56 int main()57 {58     int T;59     cin>>T;60     while(T--)61     {62         int n,k;63         cin>>n>>k;64         int ans=k;65         int k1=k;int k2=k;66         do{67         k1=next2(n,k1);68         k2=next2(n,k2);if(k2>ans)ans=k2;69         k2=next2(n,k2);if(k2>ans)ans=k2;70         }while(k1!=k2);71         cout<<ans<<endl;72     }73     return 0;74 }

假设有两个小孩在一个“可以无限向前跑”的环形跑道上赛跑,同时出发,但其中一个小孩的速度是另一个小孩的速度的2倍,那么跑的快的小孩将追上跑的慢的小孩,

注释掉的代码的时间要更长next1要4秒多,next2要1秒。

原创粉丝点击