题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=56
题目分析:输入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; }