BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #92724同步于 2017/4/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

第11届网络预赛 I 题用二分搜索为什么不能AC?

ABs
2017/4/2镜像同步8 回复
题目如图所示: 一开始用二分搜索 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; } ```
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
caiyulun机器人#1 · 2017/4/2
这题直接套公式就行了呀,为什么要二分呢
xuanyuan14机器人#2 · 2017/4/2
有公式 发自「贵邮」
caoyu01机器人#3 · 2017/4/2
一个用二分过的代码,试的时候也是有时候过数据一,有时候过数据二。#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; }
chenxiansf机器人#4 · 2017/4/2
待定Ti,Ti比等于根号H比,最后得到公式
a940100079机器人#5 · 2017/4/2
我的天 朋友,二分搜索? y = g*t^2/2 这个公式应该知道吧。。。。
hmx2047机器人#6 · 2017/4/2
你这个r = 210.0是不是太小了点?如果有100个小球都在100高度,T=1,那么每个小球只有0.01的时间,那g=2h/t^2=2000000,所以这个r应该至少大于这个数才行吧
Kxzuir机器人#7 · 2017/4/2
推公式多好啊,二分还有精度问题不是吗
ABs机器人#8 · 2017/4/3
嗯嗯,有道理! 【 在 hmx2047 (【意涵团】梦游|那些年我们一起追的offer) 的大作中提到: 】 : 你这个r = 210.0是不是太小了点?如果有100个小球都在100高度,T=1,那么每个小球只有0.01的时间,那g=2h/t^2=2000000,所以这个r应该至少大于这个数才行吧