——by A Code Rabbit
Description
- 有 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;
}
参考资料:寒月博客