我是菜狗
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n, num, pos; // pos存放第k大的数idx的下标
while (scanf("%d", &n) != EOF) {
if (!n) continue; // 如果n为0,跳过当前循环
vector<int> vec;
vector<int> dis;
vec.push_back(0); // 保证数组从1开始存放
int cnt = 0; // 表示所有数需要反转的次数
// 输入数组
for (int i = 0; i < n; i++) {
scanf("%d", &num); // 数字是1-n
vec.push_back(num);
}
// 煎饼排序
for (int idx = n; idx >= 1; idx--) {
// 判断是否在最终位置上
if (vec[idx] == idx) {
continue;
}
else {
// 找到当前最大值的下标
for (int i = 1; i <= n; i++) {
if (vec[i] == idx) {
pos = i;
break;
}
}
// 如果最大值不在最上面,翻转1到pos(如果最大值在最前面,则少一次翻转)
if (pos != 1) {
reverse(vec.begin() + 1, vec.begin() + pos + 1);
dis.push_back(pos);
cnt++;
}
// 翻转1到idx,将最大值放到正确位置
reverse(vec.begin() + 1, vec.begin() + idx + 1);
dis.push_back(idx); // 每次翻转的次数与距离都要记录
cnt++;
}
}
// 输出结果
printf("%d", cnt);
for (auto it = dis.begin(); it != dis.end(); it++) {
printf(" %d", *it);
}
printf("\n");
}
return 0;
}

京公网安备 11010502036488号