牛客周赛ROUND66-C题题解

牛客周赛ROUND66-C题题解

题目描述:

小苯有一个正整数 n,他想让 n 尽可能小,为此他可以做如下的操作任意次:
将 n 的第一个数位放在最后一位。(例如 n=123,则操作完后 n=231)。

小苯想知道他最小可以将 n 变为多少,请你帮他算一算吧。

输入描述:

每个测试文件内都包含多组测试数据。
第一行一个正整数 
(1≤T≤100000),表示测试数据的组数。
接下来对于每组测试数据,输入包含一行一个正整数(1≤n≤10^10)
(特别的,保证 n 的数位中不含 0。)

输出描述:

输出包含 T 行,每行一个整数 n,表示小苯进行完操作后 n 的最小值。

示例1:

输入:

4
24567464
56876563
567786432
1234

输出:

24567464
35687656
256778643
1234

解题思路:

这道题,我一开始想着用递归做,后来越想越没想明白。赛后一看别人写的题解,才发现这个可以直接用暴力枚举做,属实是被思路困住了。

对于n=1234,我们做一次旋转后得到2341,再一次旋转得到3412,再一次得到4123,再一次又得到1234,所以一共要做s.length()次旋转,

那么我们直接循环就可以了,每次循环都做一次旋转,总共做s.length()次。

AC代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N =15;
using ll=long long;
int T;              																																																										                                                                                                                                                                                                                                                        
void solve()
{
	scanf("%d",&T);
	
	while(T--)
	{
	   ll n;
	   scanf("%lld",&n);
	   
	   string s=to_string(n);
	   
	   ll ans=n;
	   
	   for(int i=0;i<s.length();i++)
	   {
	   	     string next_s=s.substr(1)+s.substr(0,1);  //旋转字符串 
	   	     s=next_s;
	   	     ans=min(ans,stoll(next_s));  //求最小值 
	   }
	   
	   cout<<ans<<endl;
	}
}
int main()
{
	solve();
	
	
	return 0;
}



posted @ 2024-11-03 22:33  Emila  阅读(60)  评论(0)    收藏  举报