返回信息流题目如图所示:
一开始用二分搜索 g 直到 t1 + t2 + ... + ti == T 或者 r - l <= 1e-8, 为什么不对呢?改精度为1e-9 以及 1e-10,也不对。。
求大神解答。求错误样例!
代码如下:
```C++
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 1000
#define minx 1e-10
int n,T;
int h[MAXN];
double sum(double g) {
double _s = 0.0;
for(int i = 0; i < n; i++) {
_s += sqrt(2.0 * h[i] / g);
}
return _s;
}
int main()
{
while(scanf("%d%d",&n,&T) != EOF)
{
for(int i = 0; i < n; i++) {
scanf("%d", &h[i]);
}
double l = 0.0, r = 210.0, mid;
while (r - l > minx) {
mid = (l + r) / 2.0;
double t = sum(mid);
if(T - t > minx) {
r = mid;
}else {
l = mid;
}
}
printf("%.7lf\n", (l + r) / 2.0);
}
return 0;
}
```
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92724同步于 2017/4/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
第11届网络预赛 I 题用二分搜索为什么不能AC?
ABs
2017/4/2镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
一个用二分过的代码,试的时候也是有时候过数据一,有时候过数据二。#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define EPS 1e-10
double hight[110];
int n,T;
double sum(double g)
{
double res=0.0;
for(int i=0;i<n;i++)
{
res+=sqrt(2.0*hight[i]/g);
}
return res;
}
double binsearch(double l,double r,double aim)
{
int cnum=0;
while(fabs(l-r)>=EPS && cnum<=10000)
{
cnum++;
double mid = (l+r)/2.0;
if(sum(mid)>=aim) l = mid;
else r = mid;
}
return l;
}
int main()
{
//freopen("in.txt","r",stdin);
while(cin>>n>>T)
{
for(int i=0;i<n;i++)
{
cin>>hight[i];
}
printf("%.7lf\n",binsearch(0.0,1000000.0,T));
}
return 0;
}
你这个r = 210.0是不是太小了点?如果有100个小球都在100高度,T=1,那么每个小球只有0.01的时间,那g=2h/t^2=2000000,所以这个r应该至少大于这个数才行吧
嗯嗯,有道理!
【 在 hmx2047 (【意涵团】梦游|那些年我们一起追的offer) 的大作中提到: 】
: 你这个r = 210.0是不是太小了点?如果有100个小球都在100高度,T=1,那么每个小球只有0.01的时间,那g=2h/t^2=2000000,所以这个r应该至少大于这个数才行吧