PAT-B 1049 數列的片段和【規律】

Enjoy_process發表於2019-02-24

                                            PAT-B 1049 數列的片段和

                    https://pintia.cn/problem-sets/994805260223102976/problems/994805275792359424

 

 

題目

給定一個正數數列,我們可以從中擷取任意的連續的幾個數,稱為片段。例如,給定數列 { 0.1, 0.2, 0.3, 0.4 },我們有 (0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 這 10 個片段。給定正整數數列,求出全部片段包含的所有的數之和。如本例中 10 個片段總和是 0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

輸入第一行給出一個不超過 10​5​​ 的正整數 N,表示數列中數的個數,第二行給出 N 個不超過 1.0 的正數,是數列中的數,其間以空格分隔。

輸出

在一行中輸出該序列所有片段包含的數之和,精確到小數點後 2 位。

樣例輸入

4
0.1 0.2 0.3 0.4

樣例輸出

5.00

分析

規律題,易知元素i被加的次數等它前面的元素個數(包含它)乘以它後面的元素個數(包含它),注意程式開始這樣寫的ans+=a[i]*(i*(n-i+1)),即先讓計算 i*(n-i+1),當i取某些值時結果會超過int的表示範圍,會溢位。因此需要進行強制型別轉換,或者按照現在的程式這樣寫,具體看程式。 

C++程式

#include<iostream>

using namespace std;

const int N=100005;

double a[N];

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	  scanf("%lf",&a[i]);
	double ans=0;
	for(int i=1;i<=n;i++)
	  ans+=a[i]*i*(n-i+1);//元素i要被加 i*(n-i+1)次
	printf("%.2lf\n",ans);
	return 0; 
}

 

相關文章