CF1523C Compression and Expansion (思维 + 模拟)

题目链接: 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;
}

END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥Fau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值