题目分析:输入n个数(n<=30),假设编号0~n-1,每次将子序列中最大的数与位置0对换(位置0与0不用换),然后将这个子序列反转,最终数组要从小到大排列好。
(位置p为子序列中数最大的位置,每次对换要输出一个数,即n-p,代表从右往左数第几个数,如果描述不清请看样例)
样例分析: 输入8 4 6 7 5 2,
①:8为最大的数(位置0与0 不用对换),然后将位置0于最后一个位置对换,即2 5 7 6 4 8;
②:2 5 7 6 4中7最大,将位置0与位置2对换(即7),对换后:7 5 2 6 4 ,然后反转,即4 6 2 5 7,刚开始对换好的8不用动,这一步对换的结果:4 6 2 5 7 8
③:4 6 2 5中6最大,将6对换到位置0,即6 4 2 5,然后反转,即5 2 4 6,加上前俩步的结果,即5 2 4 6 7 8
④:5 2 4中5最大(位置0与0 不用对换),然后反转,即4 2 5,加上前三步结果,即4 2 5 6 7 8
⑤:4 2中4最大(位置0与0 不用对换),然后反转,即2 4,加上前四步结果,即2 4 5 6 7 8,完毕。
对于输出:每次对换时输出位置k,即从右往左数第几个数。最后输出0。
①:8与2(即位置0与位置5)对换时输出1,从右往左数2是第一个数,所以输出1。
②:将2 5 7 6 4 8中2和7对换了,输出4(从右往左数7是第四个数)。然后反转,输出2。
③:4 6 2 5 7 8中4和6对换,输出5,然后反转,输出3.
④:输出4.
⑤:输出5.
最后输出0,结束。
代码仿照个刘汝佳代码写的:
#include<cstdio>
#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
int n,a[55];
void file(int p){
for(int i=0;2*i<p;i++)//此处不能是i<p/2
swap(a[i],a[p-i]);
printf("%d ",n-p);
}
int main(){
string s;
while(getline(cin,s)){
cout << s << endl;
stringstream ss(s);
n=0;
int num;
while(ss >> num) a[n++]=num;
for(int i=n-1;i>0;i--){
int p=max_element(a,a+i+1)-a;
if(i==p) continue;
if(p>0) file(p);
file(i);
}
printf("0\n");
}
return 0;
}