CSP202112-1

CSP202112-1_第1张图片
CSP202112-1_第2张图片
这个题看起来有点复杂,其实仔细看也觉得复杂;
起初我的思路是,把0-(N-1)用一个for循环列举出来,把f(x)一个个求出来然后相加
那么f(x)怎么求呢?好家伙,我开始的想法居然是按照题目意思,把x和序列A中的数按顺序一个个去对比,然而,这样就导致对于每个x,都要去比对序列中的值,而序列中有一部分是比对过的,这样会造成很大的时间复杂度。我甚至企图用递归来求解,答案显然是超时了。

没想到第一题就消耗了我这么多时间,(主要还是自己在写题目的时候不够专心,没有认真审题)

我再好好读题。
0-(N-1),这是个连续的整数序列,而我要拿这个序列去和序列A对比,,,,(思考ing)
“连续”“整数”,这给的条件也太好了吧!我转念一想:序列A本身其实也包括了连续整数序列呐,可以换个角度想,假设有一个整数序列:0~A[n],每个整数和数轴上的点一一对应,题目说的序列A不就是数轴上特殊的点吗?
CSP202112-1_第3张图片
看这张图片,对比上下两排数字,再按照题目意思理一遍思路,不难得出这个结论f(i)=i*(a[i+1]-a[i]),不过我又考虑到一个问题,如果N-1很小,比如在a[2]和a[3]之间呢?那不就不是那么恰巧了?但是,题目强调,n=n;那又有问题了,如果N-1很大呢?那好算,f(a[n])=f(a[n]+1)=...=f(N-1)=n;

下面就直接看代码吧:

include

using namespace std;

int main() {

int i, n, N;
cin >> n >> N;
int a[n + 5];
a[0] = 0;
for (i = 1; i <= n; i++)
    cin >> a[i];

int sum = 0;
for (i = 0; i < n; i++) {
    sum += (a[i + 1] - a[i]) * i;
}
sum += n * (N - 1 - a[n] + 1);
cout << sum;
return 0;

}

总结:这题确实挺简单,但是因为不认真审题没有换角度思考,导致自己走了很多弯路。最后,自知思路狭隘,欢迎大家提出修改意见!

你可能感兴趣的:(c++)