传送门:POJ1759
题意:给出一个递推公式Hi = (H i-1 + H i+1)/2 - 1, for all 1 < i < N
和首项 H1 = A,问在保证所有项都非负的情况下第n项最小为多少。
思路:容易得到 Hi+1 = 2 * Hi + 2 - Hi-1,接着向后推几项就可以知道H[n]一定可以用H[2] 和H[1]线性表示,因此我们可以二分H[2],然后判断有没有小于0的项就行了,由于要Hn最小,H2一定是小于H1的,这点图中也暗示的很清楚了。
这里有个详细思路:点击打开链接
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#define ll long long
#define pi acos(-1)
#define MAXN 100010
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int>P;
bool check(int n, double h1, double h2)
{
for(int i = 3; i <= n; i++)
{
h1 = 2 * h2 - h1 + 2;
if(h1 < 0) return 0;
swap(h1, h2);
}
return 1;
}
int main()
{
int n;
double l = 0, r, mid, a;
cin >> n >> a;
r = a;
for(int i = 0; i < 50; i++)
{
mid = (l + r) / 2;
if(check(n, a, mid))
r = mid;
else
l = mid;
}
for(int i = 3; i <= n; i++)
{
a = 2 * r - a + 2;
swap(a, r);
}
printf("%.2lf", r);
return 0;
}