OJ 關於某種規律陣列的簡單計算問題

2021-09-27 04:45:15 字數 2162 閱讀 8641

有乙個n+2個元素a[0], a[1], …, a[n+1] (n <= 3000, -1000 <= a[i] <=1000)構成的數列.

已知對i=1, 2, …, n有a[i] = (a[i-1] + a[i+1])/2 - c[i].

給定a0, a[n+1], c[1], … , c[n]. 寫乙個程式計算a[1].

第一行是整數n. 接下來兩行是a[0]和a[n+1], 其小數點後有兩位數字. 其後的n行為ci, 每行乙個數.

輸出為a[1], 格式與a[0], a[n+1]相同.

1

50.50

25.50

10.15

27.85
問題分析:關於這種的題目,也就是說陣列中第 i 項跟前面的一項和後面的一項都有等式關係這樣的問題,第一反應就是遞迴了,但是我用遞迴的方式檢測資料是符合條件的。但是卻一直提示說記憶體超限

所以我不得不研究數學公式了,這不是等差數列,也不是等比數列,似乎沒有什麼規律可循,其實不然,用草稿紙多算算,可以得到結論如下:

a[1]

=(a[0]+a[2]

)/2 - c[1]

a[2]

=(a[1]+a[3]

)/2 - c[2]

a[3]

=(a[2]+a[4]

)/2 - c[3]

...a[n]

=(a[n-1]+a[n+1]

)/2 - c[n]

左邊全部加起來,右邊也全部都加起來,等式依然成立,可以算出結論如下:

a[1]+a[n]

= a[0] + a[n+1] - 2*tn (其中tn = c[1] + c[2] + ... + c[n]

)

接著我們把a[n]中的n寫成n-1,則下面的等式一定也成立(n>=2)

a[1]+a[n-1]

= a[0]+a[n] - 2*tn-1

把上面那兩個式子對應加起來,可以得到

2*a[1] + a[n-1]

= 2*a[0]+a[n+1] -2*(tn+tn-1)

類似地,可以得到結論如下:

3*a[1] + a[n-2]

= 3*a[0]+a[n+1] - 2*(tn+tn-1+tn-2)

....

n*a[1] + a[1]

= n*a[0]+a[n+1] - 2*(tn+tn-1+tn-2+...+t1)

所以可以得出結論為:

a[1]

=(n*a[0]+a[n+1]-2*(tn+tn-1+tn-2+...+t1))/(n+1)

所以這個題目代入這個公式進行計算就好了。

#include

#include

using namespace std;

// 計算陣列中前size項之和

doubletn(

double c,

int size)

return result;

}// 記陣列前i項的和為ti 而sn則是把所有的ti加起來

doublesn(

double c,

int n)

return result;

}// written by smileyan

intmain()

// 單純地套公式計算就好了,是不是很簡單? 謝謝支援smileyan!

double y =

(double((

double

)n*a[0]

+(double

)a[n+1]

)-2*

sn(c,n))/

(n+1);

printf

("%.2lf\n"

,y);

return0;

}

這個題目本身也不難,就是考數學功底和草稿紙。算得有些心煩意亂,不過其實也就這樣吧。

smileyan

2023年9月17日 22:46

JavaScript簡單的陣列計算

求乙個陣列中的最大值和最小值,以及索引 求乙個陣列中的最大值和最小值,以及索引 var arr 5,4,6,7,110,12,3 假設陣列中的第乙個數是最大值 var max arr 0 var maxindex 0 假設陣列中的第乙個數是最小值 var min arr 0 var minindex...

關於陣列的簡單講解

建立乙個陣列元素 var arr a b c d alert arr 顯示陣列內容 console.log arr 顯示陣列 console.log arr.length 顯示陣列長度,因為陣列排列從0開始,所以顯示的長度會加一 delete arr 2 console.log arr 通過dele...

簡單的關於陣列的處理

1 array push 這個函式用於在陣列元素的末尾新增新元素 2 unset 允許刪除陣列中的某個鍵值對,但是刪除後陣列不會重建索引。若需要將刪除後的陣列重建索引,可以使用array values 例如 a array 1 one 2 two 3 three unset a 2 新陣列為 a a...