牛客周赛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;
}