uva120 Stacks of Flapjacks 入门经典II 第八章例题8-1

题目链接: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;
}



你可能感兴趣的:(uva,入门经典,例题8-1,高效算法设计,uva120)