UVa 120

题意:给一摞随意摞的煎饼,要按直径从上到下递增的顺序排列,求翻的顺序。

思路:贪心。

1,读取煎饼数据,新建一个数组,复制数据,排序,作为参考。

2,从最大直径(maxNum)的煎饼开始,看其是否在底层,是的话就寻找上一层最大的。

3,假如不在底层,看其在不在顶层,在顶层就把全部煎饼翻过来,使当前需要操作的最大的直径煎饼放在最下。

4,假如不在底层也不在顶层,就找到它,先翻到顶层,然后步骤同3.

直到maxNum代表数据为最小直径的煎饼。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define MAXN 110

class Flapjacks{
    private:
        int jacks[MAXN];
        int ansJack[MAXN+MAXN];
        int ansLoop;
    public:
        void init();
        void process();
        void reserv(int a[],int num);//反转数组操作,num为反转位置
        void output();
};
void Flapjacks::reserv(int a[],int num){
    int tempArry[num];
    for(int loop1 = num - 1,loop2 = 0;loop1 >= 0;loop1--){
        tempArry[loop2++] = a[loop1];
    }
    for(int loop1 = 0;loop1 < num;loop1++){
        a[loop1] = tempArry[loop1];
    }
}
void Flapjacks::init(){
    memset(jacks,0,sizeof(jacks));
}
void Flapjacks::process(){
    int loop = 0,n;
    char c;
    while(scanf("%d%c",&n,&c)!=EOF){
        if(c != '
'){
            printf("%d ",n);
            jacks[loop++] = n;

        }
        else {
            jacks[loop++] = n;
            cout<<n<<endl;
            int clon[MAXN],maxNum;
            for(int i = 0;i < loop;i++)
                clon[i] = jacks[i];
            sort(clon,clon + loop);
            ansLoop = 0;
            ansJack[0] = 0;
            for(int i = loop - 1;i >= 0;i--){
                maxNum = clon[i];//maxNum 记录当前未正确归位的煎饼
                if(maxNum == jacks[i]){
                    continue;
                }
                else{
                    if(jacks[0] == maxNum){//需要操作的煎饼在最上边时的操作
                        reserv(jacks,i+1);//从loop - i处反转
                        ansJack[ansLoop++] = loop - i;
                    }
                    else{
                        for(int j = 0;j < loop;j++){//需要操作的煎饼在不最上边时的操作
                            if(jacks[j] == maxNum){
                                reserv(jacks,j+1);
                                ansJack[ansLoop++] = loop - j ;
                                break;
                            }
                        }
                        reserv(jacks,i+1);
                        ansJack[ansLoop++] = loop - i;
                    }
                }
            }
            output();
            loop = 0;
            init();
        }

    }
}
void Flapjacks::output(){
    for(int i = 0;i < ansLoop;i++){
        cout<<ansJack[i]<<" ";
    }
    cout<<0<<endl;
}

int main()
{
    //#ifndef ONLINE_JUDGE
    //    freopen("D:\acm.txt","r",stdin);
   // #endif // ONLINE_JUDGE
    Flapjacks flapjacks;
    flapjacks.process();
    return 0;
}
Donghua University
原文地址:https://www.cnblogs.com/ohxiaobai/p/4491280.html