HDU - 2086 = A1 = ?
数学题,本(zhi)人(zhang)觉得挺难的。。。
题目
解题思路
数学“思想”
因为 Ai = (Ai-1 + Ai+1) / 2 - Ci
A1 = (A0 + A2) / 2 - C1;
A2 = (A1 + A3) / 2 - C2;
=> A1 + A2 = (A0 + A2 + A1 + A3) / 2 - (C1 + C2);
=> A1 + A2 = (A0 + A3) - 2(C1 + C2);
同理: A1 + A1 = (A0 + A2) - 2C1;
A1 + A2 = (A0 + A3) - 2(C1 + C2 + C3);
A1 + A3 = (A0 + A4) - 2(C1 + C2 + C3 + C4);
...
A1 + An = (A0 + An+1) - 2(C1 + C2 + ... + Cn);
对上式求和:
nA1 + A1 + (A2 + A3 + ... + An) = nA0 + (A2 + A3 + ... + An) + An+1 - 2(nC1 + (n-1)C2 + ... + 2Cn-1 + Cn);
=> (n+1)A1 = nA0 + An+1 - 2(nC1 + (n-1)C2 + ... + 2Cn-1 + Cn);
综上: A1 = [nA0 + An+1 - 2(nC1 + (n-1)C2 + ... + 2Cn-1 + Cn)] / (n + 1)。
小波折
一开始用的cin输入的,直接Tle了,忘了输入项非常多了。。。
Ac代码
// 2086 - A1 = ?
int main() {
const int maxn = 3030;
int n;
double x, y, c[maxn]; // x为A0,y为An+1
while (~scanf("%d", &n)) {
scanf("%lf%lf", &x, &y);
for (int i = 1; i <= n; i++) {
scanf("%lf", &c[i]); // 不能用cin,会Tle
}
double sum = 0.0;
for (int i = 1; i <= n; i++) {
sum += (n - i + 1) * c[i];
}
sum = (n * x + y - 2 * sum) / (n + 1);
printf("%.2lf\n", sum);
}
return 0;
}
小结
- 纯数学题好像比算法还要难哎(不过应该是我啥算法都不会的缘故吧)。。