POJ1759
题意
简单题
有一个花环,旁边挂灯泡,总共n个灯泡,第Hi个灯泡的高度是H(i+1) 和 H(i-1)高度的平均值减1.
H1 = A
Hi = (H i-1 + H i+1)/2 - 1, for all 1 < i < N
HN = B
Hi >= 0, for all 1 <= i <= N
现在给出总共灯泡的个数n,以及第一个灯泡的高度,求一个高度最低的最后一个灯泡的高度使得每个灯泡的高度都大于等于0。
思路:
直接二分第二个灯泡的高度,通过第一,第二个灯泡的高度可以求得三个灯泡的高度,同理,可以求得最后一个灯泡的高度。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e3+5;
double h[maxn];
int N;
double A;
double B;
bool C(double mid){
memset(h,0,sizeof(h));
double MIN = INF;
h[0] = A;
h[1] = mid;
MIN = min(MIN,A);
MIN = min(mid,MIN);
for(int i=2;i<N;i++){
h[i] = (h[i-1] + 1)*2 - h[i-2];
if(h[i] < 0) return false;
}
B = h[N-1]; //可能最后一次是不行的 所以 但是也改变了h[i]的值
return true;
}
int main(){
scanf("%d%lf",&N,&A);
double l = -1,r = INF;
int ans = 0;
while(ans<200){
double mid = (l+r)/2;
if(C(mid)) r = mid;
else l = mid;
ans++;
}
printf("%.2f\n",B);
return 0;
}