UVaOJ 10152 - ShellSort

——by A Code Rabbit


Description

  • 有 n 只乌龟排成一个竖列。
  • 每次只能把一只乌龟提到最上面。
输入 n 只乌龟的初始排列和目标排列,输出操作次数最少的操作。


Types

Date Structure :: Lists


Analysis

由于越后面提出来的乌龟会放在越上面,最后一只提出来的乌龟会放在最上面。

可以利用栈相似的性质——后进先出。

将目标排列中的乌龟从上往下一个个放到栈里,直到剩下的乌龟刚好和目标排列一致,便不必要再操作了,并且肯定是操作次数最少的(不知道怎么表达,可以认为去操作乌龟放入栈中是必须的,而剩下不必要再动的乌龟是无须操作的,仅做了必须要做的操作,自然是最少的)。

最后将乌龟一个个从栈中弹出,便是所求的操作。


Solution

// UVaOJ 10152
// ShellSort
// by A Code Rabbit

#include <iostream>
#include <map>
#include <stack>

using namespace std;

int k;

string original_ordering[200];
string desired_ordering[200];
int n;

map<string, int> turtles;
stack<string> operations;

int main() {
    cin >> k;
    while (k--) {
        // Inputs.
        cin >> n;
        cin.get();
        for (int i = 0; i < n; ++i) {
            getline(cin, original_ordering[i]);
            turtles[original_ordering[i]] = i;
        }
        for (int i = 0; i < n; ++i) {
            getline(cin, desired_ordering[i]);
        }
        // Run.
        for (int i = 0; i < n; ++i) {
            bool isSorted = true;
            for (int j = i; j < n - 1; j++)
                if (turtles[desired_ordering[j]]
                  > turtles[desired_ordering[j + 1]]) {
                    isSorted = false;
                    break;
                }
            if (isSorted) {
                break;
            } else {
                operations.push(desired_ordering[i]);
            }
        }
        // Outputs.
        while (!operations.empty()) {
            cout << operations.top() << endl;
            operations.pop();
        }
        cout << endl;
    }

    return 0;
}



下载PDF

参考资料:寒月博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值