题目链接: Compression and Expansion
大致题意
让你模拟写书的目录, 但是对于每一行的情况, 都只保留了最后一个数字. (看样例吧QAQ, 不好叙述啊)
要求, 还原出一个合法的目录.
解题思路
首先我们考虑到1
这个数字, 他比较特殊, 因为这表示我们必须新开一点.
然后对于其余的所有数字. 我们的做法是, 能保证上一行尽可能少删除的情况下, 使得当前情况合法.
因为我们一旦把某些点删除了, 我们再开新行的时候, 就再也不能返回去用了. 且我们也可以保证在这种情况下, 可以得到最优解, 因为之前出现过的每一点, 也必然都是之前给出过的数字. 因此如果给出的序列是合法的, 必然我们可以回溯到合法位置.
模拟的过程, 用vector来模拟栈即可. vector内维护每一行的情况.
AC代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
int main()
{
int t; cin >> t;
while (t--) {
vector<int> v;
int n; scanf("%d", &n);
rep(i, n) {
int x; scanf("%d", &x);
if (x > 1) {
while (!v.empty() and v.back() + 1 != x) v.pop_back();
v.pop_back();
}
v.push_back(x);
rep(i, v.size()) {
if (i > 1) putchar('.');
printf("%d", v[i - 1]);
}
puts("");
}
}
return 0;
}