我接到一个c ++任务来接收一串数字。
我要做的是将该数字的第一个数字移动到最后一个数字。
例如,如果数字是1234,那么它应该是2341。
我还要做的是使数字序列不增加。
为了更好地理解,我需要做的是:
输入:
1934年
7815
1894年
6518
3281
在第一个示例中,我们将执行以下操作:
1 move on x1 : 1934 -> 9341
1 move on x2 : 7815 -> 8157
3 move on x3 : 1894 -> 8941 -> 9418 -> 4189
2 move on x4 : 6518 -> 5186 -> 1865
3 move on x5 : 3281 -> 2813 -> 8132 -> 1328
The final sequence will be 9341 ≥ 8157 ≥ 4189 ≥ 1865 ≥ 1328.
如果可以像这样生成非增加的序列,程序应该打印是,否则我应该打印否。
这是我尝试过的:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s[5];
for (int i = 0; i < 5; i++)
{
cin >> s[i];
}
for (int j = 0; j < 5; j++)
{
rotate(s[j].begin(), s[j].begin() + 1, s[j].end());
}
for (int j = 2; j < 5; j++){
while (s[j-1] <= s[j]){
rotate(s[j].begin(), s[j].begin() + 1, s[j].end());
}
}
for (int i = 0; i < 5; i++)
cout << s[i] << endl;
}
我做了所有动作,然后打印出来,我不知道如何检查是否可以制作不增加的序列。另外,根据我的逻辑,如果我不能创建一个非增加的序列,while循环可能是无限循环,如何解决?感谢。
答案 0 :(得分:1)
这是解决此问题的一种方法:
将第一个数字旋转到最大可能值。
e.g。对于数字1894
,有4种可能的轮换:{1894, 8941, 9418, 4189}
。最大的一个是9418
。
对于其余数字,将它们旋转到最大可能值,该值等于或小于前一个数字的所选旋转。如果没有这样的旋转那么序列是不可能的。
对于你的例子:
1934
:最大轮播为9341
7815
:最大轮换<= 9341
为8157
1894
:最大轮换<= 8157
为4189
6518
:最大轮换<= 4189
为1865
3281
:最大轮换<= 1865
为1328