UVaOJ 120 - Stacks of Flapjacks

来源:互联网 发布:陈家洛喜欢谁 知乎 编辑:程序博客网 时间:2024/05/16 08:32

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]);}