ACdream1207 群赛C qj的寻找爱情之旅(二分)
2014-09-19 14:51
211 查看
题目链接:http://115.28.76.232/problem?pid=1207
突然有一天,村子里流传着一个故事,传说爱情正静静躺在这个真爱峡谷的另一端。
傻乎乎的qj一听闻这个消息就喜出望外,倍感高兴,于是开始了他的寻找真爱之旅。
首先第一步就是得找到爱情的位置。
他听村子的老人说过,这个峡谷可以当成由许多点构成的图形,而这些点应该会满足以下规律:
第一个点的高度: H[1]=A
第i个点的高度: H[i] = (H[i−1] + H[i+1])/2 − 1, 其中 1 < i < N
而最后一个点的高度: H
=B
对于每个点来说 Hi ≥ 0, 其中1 ≤ i ≤ N
qj目前已经知道第一个点的高度,以及点的数目,请你帮助qj求出最右边B点的最低值,那儿就应该是爱情的所在地。
两个数,分别表示N, A
整数N (3 ≤ N ≤ 1000),实数A (10 ≤ A ≤ 1000)
输出B,要求保留两位小数哦
分析:
首先可以得到公式 h[i]=2*h[i-1]-h[i-2]+2; 但是由于只知道h[1],不知道h[2],所以我试着暴力枚举了一下h[2] 发现 在前一个阶段内
递推后来肯定有一个h[i]<0,然后,在后一个阶段的时候h[i]一直大于0,而且 h[2]越大h
越大;因此在这中间肯定有个临界值
所以[0,h[1]]内二分h[2],然后可以得到最小的h
;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const double eps = 1e-6;
const int maxn = 1001;
int n;
double h[maxn];
bool judge(double p)
{
h[1]=p;
for(int i=2;i<n;i++){
h[i]=2*h[i-1]-h[i-2]+2;
if(h[i]<0)
return 0;
}
return 1;
}
double bin_search()
{
double ans=1000000000;
double l=0,r=h[0];
while(r>l+eps){
double mid=(l+r)/2;
if(judge(mid)){
r=mid;
ans=min(ans,h[n-1]);
}
else l=mid;
}
return ans;
}
int main()
{
while(~scanf("%d%lf",&n,&h[0])){
printf("%.2lf\n",bin_search());
}
return 0;
}
Problem Description
突然有一天,村子里流传着一个故事,传说爱情正静静躺在这个真爱峡谷的另一端。
傻乎乎的qj一听闻这个消息就喜出望外,倍感高兴,于是开始了他的寻找真爱之旅。
首先第一步就是得找到爱情的位置。
他听村子的老人说过,这个峡谷可以当成由许多点构成的图形,而这些点应该会满足以下规律:
第一个点的高度: H[1]=A
第i个点的高度: H[i] = (H[i−1] + H[i+1])/2 − 1, 其中 1 < i < N
而最后一个点的高度: H
=B
对于每个点来说 Hi ≥ 0, 其中1 ≤ i ≤ N
qj目前已经知道第一个点的高度,以及点的数目,请你帮助qj求出最右边B点的最低值,那儿就应该是爱情的所在地。
Input
两个数,分别表示N, A整数N (3 ≤ N ≤ 1000),实数A (10 ≤ A ≤ 1000)
Output
输出B,要求保留两位小数哦
Sample Input
692 532.81
Sample Output
446113.34
分析:
首先可以得到公式 h[i]=2*h[i-1]-h[i-2]+2; 但是由于只知道h[1],不知道h[2],所以我试着暴力枚举了一下h[2] 发现 在前一个阶段内
递推后来肯定有一个h[i]<0,然后,在后一个阶段的时候h[i]一直大于0,而且 h[2]越大h
越大;因此在这中间肯定有个临界值
所以[0,h[1]]内二分h[2],然后可以得到最小的h
;
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const double eps = 1e-6;
const int maxn = 1001;
int n;
double h[maxn];
bool judge(double p)
{
h[1]=p;
for(int i=2;i<n;i++){
h[i]=2*h[i-1]-h[i-2]+2;
if(h[i]<0)
return 0;
}
return 1;
}
double bin_search()
{
double ans=1000000000;
double l=0,r=h[0];
while(r>l+eps){
double mid=(l+r)/2;
if(judge(mid)){
r=mid;
ans=min(ans,h[n-1]);
}
else l=mid;
}
return ans;
}
int main()
{
while(~scanf("%d%lf",&n,&h[0])){
printf("%.2lf\n",bin_search());
}
return 0;
}
相关文章推荐
- acdream 1207 qj的寻找爱情之旅
- zzuliOJ 1912:小火山的爱情密码(尺取法||二分)
- 二分+RMQ——洛谷 P1419 寻找段落
- CF的LINSER啥啥的H(二分),G(换位置),C(博弈),D(前缀矩阵),B(寻找来的人)
- poj2456 二分逼近寻找正确答案
- ZZULI-1912 小火山的爱情密码 【尺取(OR 二分)+map】
- 寻找最大的K个数(二):快排优化和二分搜索
- 二分查找思想寻找有序数组中查找最小值
- 【leetcode】寻找两个已排序数组的中位数(类似二分)
- 如果有一天: 你不再寻找爱情,只是去爱;你不再渴望成功,只是去做;你不再追求成长,只是去修;一切才真正开始! —— 纪伯伦
- 为了这世间最真挚的爱情,帮主人翁寻找远走的他.....
- 寻找属于自己的爱情
- ZOJ1825-二分寻找子串
- c++ 计蒜客挑战难题第10题寻找插入位置 二分查找
- 1912: 小火山的爱情密码 (尺取比二分果然更有优势)
- Acm-群赛 Mengzhu 二分查找
- [双语阅读]正寻找爱情?试试身份徽章
- ACdream 1209 群赛D qj的招待会(flyod)
- 短语中寻找爱情
- 寻找段落(二分+单调队列)