【POJ】【2601】Simple calculations
推公式/二分法
好题!
题解:http://blog.csdn.net/zck921031/article/details/7690288
这题明显是一个方程组……可以推公式推出来……
然而这太繁琐了!发现a[i]是满足单调性的话,我们就可以二分a[1],递推出a[n+1],进行验证……
思维复杂度比推公式低到不知哪里去了,真是一种优秀的算法(然而我想不到,并没有什么*用……)
1 Source Code 2 Problem: 2601 User: sdfzyhy 3 Memory: 736K Time: 16MS 4 Language: G++ Result: Accepted 5 6 Source Code 7 8 //PKUSC 2013 B 9 //POJ 2601 10 #include<vector> 11 #include<cstdio> 12 #include<cstring> 13 #include<cstdlib> 14 #include<iostream> 15 #include<algorithm> 16 #define rep(i,n) for(int i=0;i<n;++i) 17 #define F(i,j,n) for(int i=j;i<=n;++i) 18 #define D(i,j,n) for(int i=j;i>=n;--i) 19 using namespace std; 20 typedef long long LL; 21 inline int getint(){ 22 int r=1,v=0; char ch=getchar(); 23 for(;!isdigit(ch);ch=getchar()) if (ch=='-') r=-1; 24 for(; isdigit(ch);ch=getchar()) v=v*10-'0'+ch; 25 return r*v; 26 } 27 const int N=3010; 28 const double eps=1e-4; 29 /*******************template********************/ 30 31 int n; 32 double a[N],c[N],ed; 33 inline double check(double x){ 34 a[1]=x; 35 F(i,2,n+1) a[i]=2*(a[i-1]+c[i-1])-a[i-2]; 36 return a[n+1]; 37 } 38 int main(){ 39 #ifndef ONLINE_JUDGE 40 freopen("B.in","r",stdin); 41 freopen("B.out","w",stdout); 42 #endif 43 scanf("%d%lf%lf",&n,&a[0],&ed); 44 F(i,1,n) scanf("%lf",&c[i]); 45 double l=-1000,r=1000,mid; 46 while(r-l>eps){ 47 mid=(l+r)/2; 48 if (check(mid)>ed) r=mid; 49 else l=mid; 50 } 51 printf("%.2f\n",l); 52 return 0; 53 }
Simple calculations
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6646 | Accepted: 3322 |
Description
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.
You are given a0, an+1, c1, ... , cn. Write a program which calculates a1.
Input
The first line of an input 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.
Output
The output file should contain a1 in the same format as a0 and an+1.
Sample Input
1 50.50 25.50 10.15
Sample Output
27.85
Source