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

『问题』POJ 1064关于float和double

Doubility
2016/11/5镜像同步1 回复
题目链接:[POJ 1064](http://poj.org/problem?id=1064) 下面的代码是可以AC的,但是把里面所有的double替换成float就会超时,原题中对精度的要求只是小数点后两位,想问用float为什么不行? ``` #include <iostream> #include <cstdio> #include <cmath> #define MAX_INDEX 10010 #define MAX_LENGTH 1000000 using namespace std; double cable[MAX_INDEX]; int N, K; bool Cut(double m) { int res = 0; for(int i = 0; i < N; i++) res += (int)(cable[i] / m); return res >= K; } int main() { while(scanf("%d %d", &N, &K) == 2) { for(int i = 0; i < N; i++) scanf("%lf", &cable[i]); double l = 0; double r = MAX_LENGTH; while(r - l > 1e-5) { double mid = (r + l) / 2; if(Cut(mid)) l = mid; else r = mid; } printf("%.2f\n", floor(r * 100) / 100); } return 0; } ```
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
kit机器人#1 · 2016/11/5
浮点数32位,1位符号位,8位指数位,23位尾数位(实际可以表示24位)。这个题最大长度100*1000。在你的程序里因为mid = (r + l) / 2,实际是200000这整数部分就用了17位,留给小数的只剩下7位了,所以有效的精度不到0.001了。然后就死循环了吧。