Garland
(garland.pas/cpp/in/out)
时间限制: 2.0 second
内存限制: 256 MB
问题描述
新年到了,要用一根绳悬挂n个彩灯,如下图
设彩灯i的高度为Hi
并且满足以下关系:
H1 = A
Hi = (H[i−1] + H[i+1])/2 − 1, 1 < i < N
HN = B
Hi ≥ 0, for all1 ≤ i ≤ N
求给定最左边的A点和个数N,求最右边B点的最低值。
(即:保证所有彩灯高度>=0的最小的B)
输入格式:两个数,分别表示N,A
整数N (3 ≤ N ≤ 1000),实数A (10 ≤ A ≤ 1000)
Sample input
692 532.81
Sample Output
446113.34
/*#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main(void)
{
freopen("garland.in", "r", stdin);
freopen("garland.out", "w", stdout);
double k, m, ans, p=10000000;
int n;
scanf("%d %lf", &n, &m);
ans=(n-1)*(n-2);
k=ceil(sqrt(m));
if(k<=n-1)
p=m/k+k;
k = floor(sqrt(m));
if(k<=n-1&&p>m/k+k)
p=m/k+k;
if(p==10000000)
p =m/(n-1)+n-1;
p=-p+1;
ans+=p*(n-1)+m;
printf("%.2lf", ans);
return 0;
}*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1000;
int du[maxn+10];
double xi[maxn+10];
int main()
{
freopen("garland.in","r",stdin);
freopen("garland.out","w",stdout);
int n,z;
double a;
scanf("%d%lf",&n,&a);
for (int i=1; i<=n; i++)
du[i]=du[i-1]+(i<<1);
for (int i=n; i>1; i--)
if (du[i-2]<=a)
{
z=i; break;
}
xi[z]=0.0;
xi[z-1]=double(a-du[z-2])/(double)(z-1);
for (int i=z+1; i<=n; i++)
xi[i]=(xi[i-1]+1)*2-xi[i-2];
printf("%.2lf\n",xi[n]);
fclose(stdin);
fclose(stdout);
return 0;
}
/*#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
const double INF=1e10;
double A,maxi=-INF,temp,n;
int main()
{
freopen("garland.in","r",stdin);
freopen("garland.out","w",stdout);
int i;
scanf("%lf%lf",&n,&A);
for(i=1;i<n;i++)
{
temp=1-i-A/i;
if(temp>maxi) maxi=temp;
}
printf("%.2lf\n",A+(n-1)*maxi+(n-2)*(n-1));
return 0;
}*/