AcWing 102. 最佳牛围栏---精度疑问?
原题链接
简单
作者:
shanghai
,
2020-03-24 08:14:43
,
所有人可见
,
阅读 797
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
bool judge(double val, vector<double> a, const int L) {
a[0] -= val;
for(int i = 1; i < a.size(); ++i) a[i] += a[i - 1] - val;
double res = -1;
double minv = 0;
for(int i = L - 1; i < a.size(); ++i) {
res = max(res, a[i] - minv);
if(res >= 0) return true;
minv = min(minv, a[i - L + 1]);
}
return res >= 0;
}
int search(const vector<double> &a, const int L) {
double l = 0, r = 2005;
double eps = 1e-5;
while(r - l > eps) {
double mid = (l + r) / 2;
if(judge(mid, a, L)) l = mid;
else r = mid;
}
printf("%d\n", (int)(r * 1000)); //在这里打印就不会有错误。
return (int)(l * 1000);
}
int main() {
int n, r, v;
scanf("%d%d", &n, &r);
vector<double> a;
for(int i = 0; i < n; ++i) {
scanf("%d", &v);
a.push_back(v);
}
int d = search(a, r);
//printf("%d\n", d); 如果在这里打印答案,就会WA,为什么?可以提交一下试试。
}
其实主要问题不是在哪里打印,而是输出的是l还是r。如果是r 的话,就不会有问题。
比如结果是7,但是l是6.99999999,r是7.000000,这时候l向下取整就不行了。