UVA 11549 计算器谜题(floyd判圈)

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

可以想成两个小孩,一个小孩去追另一个小孩,这个小孩是那个小孩的几倍速度都没有关系,若跑着跑着突然出现了一个循环圈,

那么快的小孩一定可以套慢的小孩的圈,直到某一刻追上。此方法可以省去stl中的set,使得空间开销变小。

#include<bits/stdc++.h>
using namespace std;

int buf[100];
int next(int n,int k){
	if(!k)
	return 0;
	long long k2=(long long)k*k;
	int l=0;
	while(k2>0){
		buf[l++]=k2%10;k2/=10;
	}
	
	if(n>l) n=l;
	int ans=0;
	for(int i=0;i<n;i++)
	ans=ans*10+buf[--l];
	return ans;
	
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,k;
		scanf("%d %d",&n,&k);
		int ans=k;
		int k1=k,k2=k;
		do{
			k1=next(n,k1);
			k2=next(n,k2);if(k2>ans) ans=k2;
			k2=next(n,k2);if(k2>ans) ans=k2;
			k2=next(n,k2);if(k2>ans) ans=k2;
			k2=next(n,k2);if(k2>ans) ans=k2;
			k2=next(n,k2);if(k2>ans) ans=k2;
		}while(k1!=k2);
		cout<<ans<<endl;		
	}
}

 

发布了57 篇原创文章 · 获赞 58 · 访问量 620

猜你喜欢

转载自blog.csdn.net/weixin_43568895/article/details/103917109