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;
}

浙公网安备 33010602011771号