返回信息流题目链接:[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;
}
```
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #91595同步于 2016/11/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
『问题』POJ 1064关于float和double
Doubility
2016/11/5镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
浮点数32位,1位符号位,8位指数位,23位尾数位(实际可以表示24位)。这个题最大长度100*1000。在你的程序里因为mid = (r + l) / 2,实际是200000这整数部分就用了17位,留给小数的只剩下7位了,所以有效的精度不到0.001了。然后就死循环了吧。