看完题目后,得到公式a[i]=2*a[i-1]-a[i-2]+2*c[i-1]; YY发现a[n+1]随a[1]增大而增大,那么就对a[1]二分吧,精度1e-4,1A。
Simple calculations
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5989 | Accepted: 3040 |
Description
There is a sequence of n+2 elements a
0, a
1, ..., a
n+1 (n <= 3000, -1000 <= a
i <=1000). It is known that
ai = (ai-1 + ai+1)/2 - ci for each i=1, 2, ..., n.
You are given a 0, a n+1, c 1, ... , c n. Write a program which calculates a 1.
You are given a 0, a n+1, c 1, ... , c n. Write a program which calculates a 1.
Input
The first line of an input contains an integer n. The next two lines consist of numbers a
0 and a
n+1 each having two digits after decimal point, and the next n lines contain numbers c
i (also with two digits after decimal point), one number per line.
Output
The output file should contain a
1 in the same format as a
0 and a
n+1.
Sample Input
1 50.50 25.50 10.15
Sample Output
27.85
Source
#include <stdio.h>
int n;
const int S=3050;
double a[S],c[S],anp1;
double fun(){
int i;
for (i=2;i<=n+1;i++)
a[i]=2*a[i-1]-a[i-2]+2*c[i-1];
return a[n+1];
}
int main(){
int i;
double l,r,mid,tmp;
scanf("%d",&n);
scanf("%lf %lf",&a[0],&anp1);
for (i=1;i<=n;i++) scanf("%lf",&c[i]);
l=-1005;r=1005;
// a[1]=27.85;fun();printf("%.2lf ||||| \n",a[2]);
while (r-l>1e-4){
mid=(l+r)/2.0;
a[1]=mid;
tmp=fun();
if (a[n+1]>anp1) {r=mid;}else if ( a[n+1]<anp1 ) {l=mid;} else break;
}
printf("%.2lf\n",mid);
return 0;
}