poj1759

二分。
可以证明的是,第二个灯的高度和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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44019404/article/details/88540314
今日推荐