[POJ 1759] Garland (二分)
2016-04-08 14:05
330 查看
POJ - 1759
这题 WA了好久,事实证明我真的想多了啊
原先化简了半天的方程组,其实完全是没必要的
由题目条件,可以化出 Hn−Hn−1+2=Hn−Hn−1H_n-H_{n-1}+2=H_n-H_{n-1}
所以相邻彩灯的位置差是等差数列
直接二分第二个的位置,然后递推求出 B的位置
中途判一下有没有位置小于 0的就好了
水题!
这题 WA了好久,事实证明我真的想多了啊
原先化简了半天的方程组,其实完全是没必要的
由题目条件,可以化出 Hn−Hn−1+2=Hn−Hn−1H_n-H_{n-1}+2=H_n-H_{n-1}
所以相邻彩灯的位置差是等差数列
直接二分第二个的位置,然后递推求出 B的位置
中途判一下有没有位置小于 0的就好了
水题!
#include <cstdio> #include <iostream> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <queue> using namespace std; typedef pair<int,int> Pii; typedef long long LL; typedef unsigned long long ULL; typedef double DBL; typedef long double LDBL; #define MST(a,b) memset(a,b,sizeof(a)) #define CLR(a) MST(a,0) #define Pow2(a) (a*a) int maxx(int a,int b){return a>b?a:b;} int minn(int a,int b){return a<b?a:b;} int abss(int a){return a<0?(-a):a;} const DBL eps=1e-8,INF=1e9; int N; DBL A,B; bool judg(DBL); int main() { while(cin>>N>>A) { DBL l=0,r=1e3; while(abs(r-l)>eps) { DBL mid=(l+r)/2; if(judg(mid)) r=mid-eps; else l=mid+eps; } printf("%.2f\n", B); } return 0; } bool judg(DBL ai) { DBL np=ai,del=ai-A; for(int i=3; i<=N; i++) { del+=2; np+=del; if(np<-eps) return 0; } B=np; return 1; }