UVaOJ 120 - Stacks of Flapjacks

AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving ::Sorting/Searching


Description

对于一个栈, 有一种操作方法 Flip(x)。

该方法可以将栈顶的 x 个元素反转。

给出一个栈序列(从上到下), 要求通过操作使其越接近栈顶的元素越小。

输出按操作的先后顺序, 输出操作数 x 。


Type

Sorting/Searching


Analysis

直接以输入序列的方式来看这题。

则题目要求通过 Flip(x) 操作, 使得输入序列变为升序。

因为 Flip(x) 不会影响 x 位之后的元素,

所以从最后一位开始, 每次找到要调换到该位置的极大值,

利用 Flip(pos) (pos为该极大值所在的位置), 将其调到最前。

然后利用 Flip(x) 将其调到对应的位置。

之后再去操作前一位, 直到全部操作完为止即可。


Solution

// UVaOJ 120
// Stacks of Flapjacks
// by A Code Rabbit

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

const int MAXN = 32;

int stack[MAXN];
int top;
char ch;

void Tranform(int idx);
void Flip(int num);

int main() {
    while (scanf("%d%c", &stack[0], &ch) != EOF) {
        top = 1;
        while (ch != '\n')
            scanf("%d%c", &stack[top++], &ch);
        for (int i = 0; i < top; i++)
            printf("%d%c", stack[i], i < top - 1 ? ' ' : '\n');
        Tranform(1);
        puts("0");
    }

    return 0;
}

void Tranform(int x) {
    if (x > top) return;
    int idx = max_element(stack, stack + top - x + 1) - stack;
    int pos = top - idx;
    if (pos != x) {
        if (pos != top) {
            printf("%d ", pos);
            Flip(pos);
        } else {
            printf("%d ", x);
            Flip(x);
        }
        Tranform(x);
    } else {
        Tranform(x + 1);
    }
}

void Flip(int x) {
    int num = top - x;
    for (int i = 0; i < (num + 1) / 2; i++)
        swap(stack[i], stack[num - i]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值