ACM-公式--HDOJ 2086--A 1=?
HDOJタイトルアドレス:転送ゲート
A1 = ?
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6965 Accepted Submission(s): 4330
Problem Description
次の方程式があります:A
i = (A
i-1 + A
i+1)/2 - C
i (i = 1, 2, 3, .... n).
Aが与えられたら
0, A
n+1とC
1, C
2, .....C
n.
プログラミング計算A
1 = ?
Input
入力には、複数のテストインスタンスが含まれます.
各例について、まず正の整数n、(n<=3000)である.そして2つの数a
0, a
n+1.次のn行は行ごとに1つの数cがある
i(i = 1, ....n);入力はファイルの終端で終わります.
Output
各試験例について、求めるa 1を1行出力(小数2桁保持).
Sample Input
Sample Output
なぜなら: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)
2[(A1+A2)+(C1+C2)] = A0+A2+A1+A3;
A1+A2 = A0+A3 - 2(C1+C2);
=> A1+A2 = A0+A3 - 2(C1+C2)
同じ理屈で得られる:
A1+A1 = A0+A2 - 2(C1)
A1+A2 = A0+A3 - 2(C1+C2)
A1+A3 = A0+A4 - 2(C1+C2+C3)
A1+A4 = A0+A5 - 2(C1+C2+C3+C4)
...
A1+An = A0+An+1 - 2(C1+C2+...+Cn)
----------------------------------------------------- 左右の和を求める.
(n+1)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)
A1 = ?
Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6965 Accepted Submission(s): 4330
Problem Description
次の方程式があります:A
i = (A
i-1 + A
i+1)/2 - C
i (i = 1, 2, 3, .... n).
Aが与えられたら
0, A
n+1とC
1, C
2, .....C
n.
プログラミング計算A
1 = ?
Input
入力には、複数のテストインスタンスが含まれます.
各例について、まず正の整数n、(n<=3000)である.そして2つの数a
0, a
n+1.次のn行は行ごとに1つの数cがある
i(i = 1, ....n);入力はファイルの終端で終わります.
Output
各試験例について、求めるa 1を1行出力(小数2桁保持).
Sample Input
1
50.00
25.00
10.00
2
50.00
25.00
10.00
20.00
Sample Output
27.50
15.00
なぜなら: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)
2[(A1+A2)+(C1+C2)] = A0+A2+A1+A3;
A1+A2 = A0+A3 - 2(C1+C2);
=> A1+A2 = A0+A3 - 2(C1+C2)
同じ理屈で得られる:
A1+A1 = A0+A2 - 2(C1)
A1+A2 = A0+A3 - 2(C1+C2)
A1+A3 = A0+A4 - 2(C1+C2+C3)
A1+A4 = A0+A5 - 2(C1+C2+C3+C4)
...
A1+An = A0+An+1 - 2(C1+C2+...+Cn)
----------------------------------------------------- 左右の和を求める.
(n+1)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)
#include <iostream>
#include <cstdio>
using namespace std;
int main (){
int i,j,n;
double sum;
while (scanf("%d",&n)!=EOF){
sum=0;
double a[3500],c[3500],d;
scanf("%lf%lf",&a[0],&a[n+1]);
for (i=1; i<=n; i++)
scanf("%lf",&c[i]);
a[1]=n*a[0]+a[n+1];
for (i = n, j = 1; i >=1&&j <= n; j++,i--)
sum += i*c[j];
a[1] = (a[1] - 2*sum)/(n+1);
printf ("%.2lf
",a[1]);
}
return 0;
}