我写了下面的二进制搜索代码:
class Solution {
public:
bool check(vector<int>& dist, double hour, int mid) {
if(mid==0) return false;
double sum=0.0;
for(int i=0; i<dist.size()-1; i++)
sum+=ceil((double)dist[i]/mid);
sum+=(double)dist.back()/mid;
return sum<=hour ? true : false;
// sum+=0.001f;
// return sum<hour || std::fabs(hour-sum)<=0.001f ? true : false;
}
int minSpeedOnTime(vector<int>& dist, double hour) {
int l=0, r=10000001;
while(l<r) {
int mid=l+(r-l)/2;
if(check(dist, hour, mid)) {
r=mid;
} else l=mid+1;
}
return r==10000001 ? -1 : r;
}
};
它起作用;接受";,但我有几个问题:
a。语句return sum<=hour ? true : false;
正确吗?我不确定,因为sum
和hour
都是double
s。我们不应该像这里讨论的那样,使用一些"ε"进行"=="比较吗
b。如果未注释,则显示以下语句:
返回sum<hour||std::fabs(小时总和(<0.001f?真:假;
产生错误的答案。为什么?问题陈述说";小时在小数后最多有两位数字;。那么,为什么它给出了一个错误的答案呢
c。如果我添加0.001f
:,它就会被接受
sum+=0.001f;
return sum<hour || std::fabs(hour-sum)<=0.001f ? true : false;
再说一遍,为什么
编辑:即使是上面的std::fabs(hour-sum)==0.001f
也不会被接受。
第2版:问题说明在这里,但我没有询问解决方案等,所以我没有在问题中发布它。
使用'==='比较双打
在这种情况下,甚至不应该使用浮点,或者至少应该大大减少浮点。
没有舍入问题的示例。
bool check(vector<int>& dist, double hour, int mid) {
long long sum_times_mid = dist.back();
for(int i=0; i<dist.size()-1; i++) {
sum_times_mid += dist[i];
}
return sum_times_mid <= hour*mid; // Only FP code here
}