有乙個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;
}
這個題目本身也不難,就是考數學功底和草稿紙。算得有些心煩意亂,不過其實也就這樣吧。
smileyan2023年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...