二分

简单题

poj1434_编程poj1434_#include_02View Code
#include <iostream>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
using namespace std;

#define maxn 50005
#define eps 10e-9

struct Cistern
{
double b, w, h, d;
}cistern[maxn];

double total;
int n;
double v;
double maxh;

int dblcmp(double a, double b)
{
if (a + eps < b)
return -1;
if (a - eps > b)
return 1;
return 0;
}

void input()
{
total
= 0;
maxh
= 0;
scanf(
"%d", &n);
for (int i = 0; i < n; i++)
{
scanf(
"%lf%lf%lf%lf", &cistern[i].b, &cistern[i].h, &cistern[i].w, &cistern[i].d);
total
+= cistern[i].h * cistern[i].w * cistern[i].d;
maxh
= max(maxh, cistern[i].h + cistern[i].b);
}
scanf(
"%lf", &v);
}

bool high(double h)
{
total
= 0;
for (int i = 0; i < n; i++)
if (dblcmp(cistern[i].b, h) <= 0 && dblcmp(cistern[i].b + cistern[i].h, h) >= 0)
total
+= (h - cistern[i].b) * cistern[i].w * cistern[i].d;
else if (dblcmp(cistern[i].b + cistern[i].h, h) <= 0)
total
+= cistern[i].h * cistern[i].w * cistern[i].d;
return dblcmp(total, v) >= 0;
}

double binarysearch()
{
double l = 0;
double r = maxh;
while (dblcmp(l, r) != 0)
{
double mid = (l + r) / 2;
if (high(mid))
r
= mid;
else
l
= mid;
}
return l;
}

int main()
{
//freopen("t.txt", "r", stdin);
int t;
scanf(
"%d", &t);
while (t--)
{
input();
if (total < v)
{
printf(
"OVERFLOW\n");
continue;
}
printf(
"%.2f\n", binarysearch());
}
return 0;
}