二分。
可以证明的是,第二个灯的高度和b的高度是映射的,所以二分查找第二个灯的高度就好了。
自己头铁搞了半天的递推公式,其实拿数组记录就好了,当时写了一行 就反应过来了,不过太懒了就没有改了结果多弄了半个小时。。。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<map>
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
const double esp = 1e-6;
const double pi = acos(-1.0);
const long long INF = 0x3f3f3f3f;
using namespace std;
typedef pair<int, int> pir;
#define esp 1e-3
int n;
double a;
int main() {
cin >> n>>a;
double lf = 0;
double rt = a;
double mid;
double hi2;
double hi1 = a;
double ans=0;
bool flag = true;
up(i,0,100){
mid = (lf + rt) / 2;
// cout << "rt"<<rt << endl;
//cout <<"lf"<< lf << endl;
//cout << mid<<endl;
hi2 = 0;
hi1 = a;
double mid1 = mid;
flag = true;
up(j, 2, n)
{
hi2 = 2 * (mid1 + 1) - hi1;
if (hi2 < 0) { lf = mid; flag = false; break; }
//cout << hi2<<endl;
hi1 = mid1;
mid1 = hi2;
}
if (flag) {
ans = mid1;
rt = mid;
}
}
printf("%.2f", ans);
return 0;
}