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

来源:互联网 发布:linux下配置ip地址 编辑:程序博客网 时间:2024/06/06 05:55

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



0 0
原创粉丝点击