B - Stacks of Flapjacks UVA - 120

Background
Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation. Stacks are also important in the theory of formal languages.

This problem involves both butter and sustenance in the form of pancakes rather than bread in addition to a finicky server who flips pancakes according to a unique, but complete set of rules.

The Problem
Given a stack of pancakes, you are to write a program that indicates how the stack can be sorted so that the largest pancake is on the bottom and the smallest pancake is on the top. The size of a pancake is given by the pancake‘s diameter. All pancakes in a stack have different diameters.

Sorting a stack is done by a sequence of pancake ``flips‘‘. A flip consists of inserting a spatula between two pancakes in a stack and flipping (reversing) the pancakes on the spatula (reversing the sub-stack). A flip is specified by giving the position of the pancake on the bottom of the sub-stack to be flipped (relative to the whole stack). The pancake on the bottom of the whole stack has position 1 and the pancake on the top of a stack of n pancakes has position n.

A stack is specified by giving the diameter of each pancake in the stack in the order in which the pancakes appear.

For example, consider the three stacks of pancakes below (in which pancake 8 is the top-most pancake of the left stack):

8 7 2
4 6 5
6 4 8
7 8 4
5 5 6
2 2 7
The stack on the left can be transformed to the stack in the middle via flip(3). The middle stack can be transformed into the right stack via the command flip(1).
The Input
The input consists of a sequence of stacks of pancakes. Each stack will consist of between 1 and 30 pancakes and each pancake will have an integer diameter between 1 and 100. The input is terminated by end-of-file. Each stack is given as a single line of input with the top pancake on a stack appearing first on a line, the bottom pancake appearing last, and all pancakes separated by a space.

The Output
For each stack of pancakes, the output should echo the original stack on one line, followed by some sequence of flips that results in the stack of pancakes being sorted so that the largest diameter pancake is on the bottom and the smallest on top. For each stack the sequence of flips should be terminated by a 0 (indicating no more flips necessary). Once a stack is sorted, no more flips should be made.

Sample Input
1 2 3 4 5
5 4 3 2 1
5 1 2 3 4
Sample Output
1 2 3 4 5
0
5 4 3 2 1
1 0
5 1 2 3 4
1 2 0
    题意:一摞盘子,从上到下。个数1=<N<=30,盘子直径D,1~100,求:每次只能执行从顶部到某一个的反转,也就是像堆栈一样,先倒出来,再倒回去,最终实现,从顶到底有序(升序)。输出每次反转的位置(即每次反转的底层位置),编号从底到顶从1~N。

    解析:根据自己的模拟,需要每次找一个最大值,以它为反转开始点反转到第一个位置,再从它所对应的正确位置反转到正确位置。所以需要另开一个数组p[]排好序来记录原数组的排序后的状态,第一层for倒序p[]来更换最大值,第二层for来找出等于当前最大值而且不重合的数,进行swap操作。这里面有个细节就是对于j!=1时,需要先把它搞到最前面,然后再是放到最后面。最后注意输入输出,输入时小心T掉。

      2个h,WA了9次,T了1次,相当不容易地搞出来了。也许我是个菜鸡吧,但是我提高了,我就很满意啦。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105;
int a[maxn],p[maxn];
void ac(int id)
{
        for(int i=id;i>=id/2+1;i--)
            swap(a[id-i+1],a[i]);
}
int main()
{
    while(scanf("%d",&a[1])!=EOF)
    {
        if(getchar()==‘\n‘)
        {
            cout<<a[1]<<endl<<"0"<<endl;
            continue;
        }
        int tot=1;
        p[1]=a[1];
        while(1)
        {
            tot++;
            scanf("%d",&a[tot]);
            p[tot]=a[tot];
            if(getchar()==‘\n‘)
                break;
        }
        for(int i=1;i<tot;i++)
            cout<<a[i]<<" ";
            cout<<a[tot]<<endl;
        sort(p+1,p+1+tot);
        for(int i=tot;i>=0;i--)
        {
            if(a[i]==p[i])
                    continue;
            for(int j=i-1;j>=1;j--)
            {
                if(a[j]==p[i])
                {
                    //cout<<a[j]<<"--"<<i<<endl;
                    if(j!=1)
                    {
                        cout<<tot-j+1<<" ";
                        ac(j);
                    }
                        cout<<tot-i+1<<" ";
                        ac(i);

                    break;
                }
            }
        }
        cout<<"0"<<endl;
    }
}

原文地址:https://www.cnblogs.com/liyexin/p/12375201.html

时间: 2024-08-29 04:29:30

B - Stacks of Flapjacks UVA - 120的相关文章

Stacks of Flapjacks UVA 120

说明:这道题初读有点绕....开始我以为只是将一个序列的最大值放到最右边,把最小值放到最左边...所以就怎么也通不过啦.后来终于理解题意了,其实就是要你排个序,从左到右为从大到小.但是改变序列顺序的规则有些特殊,即只能将从最左边开始到某一位置构成的连续子序列进行对称翻转.如有序列:  2,4,9,5,7,6.我选择的位置是5所在的位置,翻转后序列就变为5,9,4,2,7,6.然后用类似于冒泡排序的方法.通过最多两次翻转可以得到最大值,然后放到右边.不断重复上述操作,即可得到一个有序序列. 题目:

[2016-03-03][UVA][120][Stacks of Flapjacks]

[2016-03-03][UVA][120][Stacks of Flapjacks] UVA - 120 Stacks of Flapjacks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Background Stacks and Queues are often considered the bread and butter of data s

uva 120 stacks of flapjacks ——yhx

 Stacks of Flapjacks  Background Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation. Stacks are also important in the theory of formal

(白书训练计划)UVa 120 Stacks of Flapjacks(构造法)

题目地址:UVa 120 水题.从最大的开始移,每次都把大的先翻到最上面,再翻到下面. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h> #include <queue> #include

UVA 120 Stacks of Flapjacks(翻煎饼,啦啦啦啦~)

Problem A : Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation. Stacks are also important in the theory

uva Stacks of Flapjacks

                                                 Stacks of Flapjacks  题目链接:Click Here~ 题目描写叙述:     给你n个数.要你得到的最后结果是从下到大排序.可是给出的序列不一定是有序你.要通过你的调整.问:要经过哪几个位置上的数的调整? 算法分析:     一開始,我的思路是直接模拟一边消除逆序数就能够了,由于我看数据非常小,仅仅有30.可是提交之后却TEL了. 后来上网查了一下.看到有一个人的思路还是非

【思维】Stacks of Flapjacks

[UVa120] Stacks of Flapjacks 算法入门经典第8章8-1 (P236) 题目大意:有一个序列,可以翻转[1,k],构造一种方案使得序列升序排列. 试题分析:从插入排序即可找到思路.每次我们优先地将没有到自己位置上的.最大的数挪到自己的位置上. 为什么可以这样做呢?难道不会改变已经排好序的么. 不会,因为我们从大往小处理,翻转的是前面的一段,而排好序的是后面一段,因此肯定不会打乱后面的. 对于每一个数,设其下标为pos,已经排好序的有x个,那么我们先将pos其变为1,即翻

Stacks of Flapjacks

Stacks of Flapjacks Background Stacks and Queues are often considered the bread and butter of data structures and find use in architecture, parsing, operating systems, and discrete event simulation. Stacks are also important in the theory of formal l

UVa 120 Stacks of Flapjacks

题意:给一摞随意摞的煎饼,要按直径从上到下递增的顺序排列,求翻的顺序. 思路:贪心. 1,读取煎饼数据,新建一个数组,复制数据,排序,作为参考. 2,从最大直径(maxNum)的煎饼开始,看其是否在底层,是的话就寻找上一层最大的. 3,假如不在底层,看其在不在顶层,在顶层就把全部煎饼翻过来,使当前需要操作的最大的直径煎饼放在最下. 4,假如不在底层也不在顶层,就找到它,先翻到顶层,然后步骤同3. 直到maxNum代表数据为最小直径的煎饼. 代码: #include <iostream> #in