CF39B Company Income Growth 题解

Content

\(P\) 经理得到了公司自 \(2001\) 年成立以来 \(n\) 年的盈利情况。这其中,\(2000+i\) 年(即第 \(i\) 年)的盈利为 \(a_i\)\(P\) 经理心目中的完美序列是这样的:选出一个尽量长的数列 \(b_1,b_2,b_3,...,b_k\),使得这个序列单调递增并都是正整数,且对于每个 \(i\in[2,k]\),都有 \(b_i-b_{i-1}=1\)。他想知道满足这样的要求的最长序列。

一句话:对于一个长度为 \(n\) 的序列 \(a_1,a_2,a_3,...a_n\),求从中选出最长的序列,设其长度为 \(k\),则对于每个 \(i\in[2,k]\),都有 \(a_{b_i}-a_{b_{i-1}}=1\),且它们原来的编号在这个序列中升序排列,每个选中的元素应当为正整数

Solution

对照原英文题面看了看,终于明白为什么要加 \(2000\) 了,原来是从 \(2001\) 开始编号的。

那我们就直接从第一个数开始搜起,从而找出 \(1,2,3,...\) 这些数的位置,输出的时候输出它们的编号就可以了。

这题只不过编号方式有些令人奇怪,其他的都不算太难。

#include <cstdio>
#include <cstring>
using namespace std;

int n, m, a[107], b[107];

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i)
		scanf("%d", &a[i]);
	for(int i = 1; i <= n; ++i) {
		if(m == a[i] - 1)
			b[++m] = i + 2000;
	}
	printf("%d\n", m);
	for(int i = 1; i <= m; ++i)
		printf("%d ", b[i]);
	return 0;
}
posted @ 2021-12-23 20:22  Eason_AC  阅读(35)  评论(0)    收藏  举报