UVA 120 煎饼

题目比较简单,容易弄混顺序之间的关系

原理是从后向前扫描,当遇到不符合顺序的,就把它移动到合适的地方,这样从后向前,就一定能排出符合顺序的煎饼果子。

题目链接:https://uva.onlinejudge.org/external/1/120.pdf

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int t=1,steps[105],step=0;

bool comp(int a,int b){
    return a>b;
}

void flip(int *a, int n){
    for(int i=1;i<=n/2;i++)
        swap(a[i], a[n-i+1]);
}

int getMax(int *a, int n){
    int maxN = n;
    for(int i=1;i<=n;i++){
        if(a[i]>a[maxN]) maxN=i;
    }
    return maxN;
}

void print(int *a){
    cout<<"\n\n===============\n\n";
    for(int i=1;i<=t;i++)
        printf("%2d",a[i]);
    cout<<"\n\n===============\n\n";
}

int main(){
// freopen("./cin", "r",stdin);
// freopen("./cout", "w", stdout);
    int n;char c;
    int a[105],temp[105];
    while (scanf("%d%c",&n,&c)!=EOF) {
        a[t]=n;
        if(c=='\n'){
            for(int i=1;i<=t;i++)
                temp[i]=a[i];
            printf("%d",a[1]);
            for(int i=2;i<=t;i++)
                printf(" %d",a[i]);
            printf("\n");

            sort(temp+1, temp+t+1);

            for(int i=t;i>=1;i--){
                if(a[i]!=temp[i]){
                    int maxN = getMax(a, i);
                    flip(a, maxN);

                    if(maxN!=1)
                        printf("%d ",t-maxN+1);
                    flip(a, i);
                    printf("%d ",t-i+1);
                }
            }
            printf("0\n");
            t=1;
            step=0;
        }else t++;
    }
    return 0;
}
点赞