一、代码如下
//202112-1-序列查询 #include <iostream> using namespace std; #define NumFlag 201 //n最大为200 int a[NumFlag];//数组A int n;//数组个数 int N;//N值 void input(){//输入n、N、数组数据 cin>>n;cin>>N; for(int i=1;i<=n;i++){ cin>>a[i]; } } void output(){//输出数组内容 for(int i=1;i<=n;i++){ cout<<a[i]<<" "; } cout<<endl; } int sum(){ int x=0;//存储sum(A)值 for(int i=2;i<=n;i++){//小于a[1]的f()值皆为0,所以从i=2开始,(a[2]-a[1])*1 x=x+(a[i]-a[i-1])*(i-1); } //上述循环没有计算N大于a[n]的部分,下述操作将其补上 x=x+(N-a[n])*n; return x; } int main(){ input(); //output(); //检验输入是否正确 int a=sum(); cout<<a<<endl; return 0; }
二、思路分析
模块一、题目的要求与提示
1、样例计算过程
此题目较长,读完脑壳都懵了,看完题后再认真看懂“ 样例计算过程 ”对理解题意与找寻解题思路有着积极的作用。
编辑
2、题目所给的提示
题目所给的这个提示对提升算法效率有着很重要的作用,没注意到这个也因紧张而使用暴力算的话……岂不是嗷呜呜。
编辑
3、变量范围
可能算法写对了,但是没注意限界条件也拿不到满分。(这里n一定小于N)
编辑
模块二、代码步骤分析
此题关键步骤在于sum(A)的计算,由模块一的读题与分析已大致有了解题思路。
但还需要注意以下细节
1、小于a[1]的f()值皆为0(所以不必算对0的求和),所以从i=2开始
对于i=2时,x=x+(a[2]-a[1])*1 ------个例
对于i时,x=x+(a[i]-a[i-1])*(i-1) ------共性
for(int i=2;i<=n;i++){ x=x+(a[i]-a[i-1])*(i-1); }
2、述循环没有计算N大于a[n]的部分,下述操作将其补上。
x=x+(N-a[n])*n;
此操作结束后x值即为所求。
模块三、结果提交
编辑