题目链接:https://cn.vjudge.net/problem/UVA-120
这一题就是一个简单的模拟选择排序,对于n个元素,每次选出当中最大的元素,然后首先将这个最大的元素换到堆顶上去(如果这个元素就在堆顶,就可以跳过此操作),然后再将其换到堆底上去(若目前最大的元素就在堆底,以上步骤都可忽略,直接进入下一步),此时的堆底第一个元素的位置已经确定不会变了,然后对剩下的n-1个元素进行同样的操作。
代码如下:
#include <bits/stdc++.h>
using namespace std;
void flip(int d[], int m, int n){
cout << n - m << " ";
for(int i = 0; i <= m/2; ++i)
swap(d[i], d[m-i]);
}
int main(){
string line;
while(getline(cin, line)){
cout << line << endl;
stringstream ss(line);
int d[50], n = 0;
while(ss >> d[n]) n++;
int a = 0, b = n;
while(a < b){
int pos = max_element(d, d+b) - d;
if(pos == b-1) { b--; continue; }
else if(pos == a) { b--; flip(d, b, n); }
else flip(d, pos, n);
}
cout << 0 << endl;
}
return 0;
}