uva 120

来源:互联网 发布:免费顶级永久域名注册 编辑:程序博客网 时间:2024/04/29 17:48

题意:

        给定一个数组,经过多次翻转后数组是递增的,输出原数组,翻转位置,最后输出一个0

     如:

           1 2 3 4 5

           0

           4 3 2 1 5

           0

           3 4 1 2 5

           4 2 4 0

题解:

            从数组的末位置开始循环,每次把对应位置最大的数翻转到对应位置,如1 2 3 4 5中5是最大的则应翻转到index=4这个位置,由于本来就在该位置,所以不用进行翻转。每次应考虑将最大数翻转到数组首地址之后,再进行最大数翻转到正确位置的操作。同时应考虑 1 1 1 1 1 输出 0 这种特殊情况

代码:

        

#include <bits/stdc++.h>using namespace std;int n;int stacks[35];void flip(int i){    int times=(i+1)/2;    for(int j=0;j<times;j++)    {       swap(stacks[j],stacks[i-j]);    }    cout<<n-i<<" ";}int main(){    string line;    while(getline(cin,line))    {       stringstream ss(line);       n=0;       while(ss>>stacks[n])       {           n++;       }       for(int j=0;j<n;j++)        cout<<stacks[j]<<" ";       cout<<endl;       for(int j=n-1;j>=0;j--)       {          int position = max_element(stacks,stacks+j+1)-stacks;          if(stacks[j]==stacks[position])  continue;          if(position>0) flip(position);          flip(j);       }       cout<<0<<endl;    }    return 0;}

         

原创粉丝点击