题意:给出离地高度b,和水箱的长宽高,给出水的容积,问装完水有多高。
二分高度,裸二分。
#include <iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct cistern { double b,h,w,d; } data[50005]; int n,t; double getans(double h) { double sum=0; for(int i=0; i<n; i++) if(h>data[i].b) sum+=h>data[i].b+data[i].h?data[i].h*data[i].w*data[i].d:data[i].w*data[i].d*(h-data[i].b); return sum; } int main() { double sum,ans,h; scanf("%d",&t); while(t--) { sum=h=0; scanf("%d",&n); for(int i=0; i<n; i++) scanf("%lf%lf%lf%lf",&data[i].b,&data[i].h,&data[i].w,&data[i].d), sum+=data[i].h*data[i].w*data[i].d, h=max(h,data[i].b+data[i].h); scanf("%lf",&ans); if(ans>sum) { puts("OVERFLOW"); continue; } double l=0,r=h,mid; while(l<=r) { mid=(l+r)/2.0; double x1=getans(mid),x2=getans(mid-1e-4); if(x1>=ans&&x2<ans) break; else if(x1<ans) l=mid+1e-4; else r=mid-1e-4; } printf("%.2f\n",mid); } return 0; }