UVa 120 - Stacks of Flapjacks(构造法)

来源:互联网 发布:必应词典 mac 编辑:程序博客网 时间:2024/05/17 06:28

给出原本煎饼的排序,输出使得煎饼从小到大排列的翻煎饼方式。

翻煎饼就相当于颠倒序列中的一段连续子序列,每次都把没排好的需要排列在最下面的那个煎饼翻上来,然后再翻到相应的位置。

#include<iostream>#include<algorithm>#include<string>#include<vector>#include<sstream>using namespace std;vector<int> a,b;bool cmp(int x,int y){    return x>y;}void reverse(int n){    for(int i=0;i<(n+1)/2;++i) swap(a[i],a[n-1-i]);    return;}bool read(){    string s;    a.clear(),b.clear();    getline(cin,s);    stringstream ss(s);    int k,first=1;    while(ss>>k){        if(first) first=0;        else cout<<" ";        cout<<k;        a.push_back(k);    }    if(!a.size()) return false;    cout<<endl;    b=a;    return true;}int main(){    ios::sync_with_stdio(false);    while(read()){        int n=(int)a.size();        sort(b.begin(),b.end(),cmp);        for(int i=0;i<n;++i){            int j=0;            for(j=0;j<n;++j)                if(a[j]==b[i]) break;            if(j==n-1-i) continue;            else if(j){                cout<<n-j<<" "<<i+1<<" ";                reverse(j+1);                reverse(n-i);            }            else{                cout<<i+1<<" ";                reverse(n-i);            }        }        cout<<"0"<<endl;    }    return 0;}


0 0
原创粉丝点击