Simple calculations
The Problem
There is a sequence of n+2 elements a0, a1,…, an+1 (n <= 3000; -1000 <= ai 1000). It is known that ai = (ai–1 + ai+1)/2 – ci for each i=1, 2, ..., n. You are given a0, an+1, c1, ... , cn. Write a program which calculates a1.
The Input
The first line is the number of test cases, followed by a blank line.
For each test case, the first line of an input file contains an integer n. The next two lines consist of numbers a0 and an+1 each having two digits after decimal point, and the next n lines contain numbers ci (also with two digits after decimal point), one number per line.
Each test case will be separated by a single line.
The Output
For each test case, the output file should contain a1 in the same format as a0 and an+1.
Print a blank line between the outputs for two consecutive test cases.
Sample Input
1
1
50.50
25.50
10.15
Sample Output
27.85
——————————————————————————————
解题思路:
这题推导过程略麻烦,实际上要经过两次叠加化简
——————————————————————————
代码:
#include<iostream> #include<fstream> #include<vector> #include<string> #include<iomanip> #include<cmath> using namespace std; int main() { ifstream cin("in.txt"); int N; cin >> N; for (int i = 0; i < N; i++) { int n; cin >> n; cin.get(); double a0, an1; cin >> a0 >> an1; vector<double> c; double tmpc; for(int j=0;j<n;j++) { cin >> tmpc; c.push_back(tmpc); } double tmpA = 0; for (int j = 1; j <= n; j++) { tmpA += c[j - 1] * (n - j + 1); } tmpA *= 2; tmpA -= (an1 + n*a0); tmpA = tmpA / (-(1 + n)); if (abs(tmpA) == 0) tmpA = 0; cout <<fixed<< setprecision(2) <<tmpA << endl; if (i != N - 1) cout << endl; } }