GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版
非常简单的一道题目。题目要求对序列排序。但是每次的操作只能是翻转从该元素到顶部元素的子序列。于是我们找到最大元素,然后首先翻转一次到顶部。然后再翻转一次就到底部了。然后再对上面n-1个元素继续这个过程。
AC代码
cpp
#include <stdio.h>
int arrOrigin[35];
int len;
int arr[35];
int stepArr[70];
int stepLen;
int findMax(int i)
{
int maxi = i;
for (int j = i - 1; j >= 0; --j)
{
if (arr[j] > arr[maxi])
maxi = j;
}
return maxi;
}
void flip(int i)
{
int t;
for (int j = 0; j <= i / 2; ++j)
{
t = arr[j];
arr[j] = arr[i - j];
arr[i - j] = t;
}
}
void loop()
{
int i, maxi;
for (i = len - 1; i > 0; --i)
{
maxi = findMax(i);
if (maxi == i)
continue;
if (maxi != 0)
{
flip(maxi);
stepArr[stepLen++] = maxi;
}
flip(i);
stepArr[stepLen++] = i;
}
}
int main()
{
int i;
while (1)
{
len = 0;
while (scanf("%d", &arrOrigin[len]) > 0)
{
arr[len] = arrOrigin[len];
++len;
if (getchar() == '\n')
break;
}
if (len == 0)
return 0;
stepLen = 0;
loop();
for (i = 0; i < len; ++i)
{
if (i != 0)
putchar(' ');
printf("%d", arrOrigin[i]);
}
putchar('\n');
for (i = 0; i < stepLen; ++i)
printf("%d ", len - stepArr[i]);
putchar('0');
putchar('\n');
}
return 0;
}