您的位置:首页 > 其它

POJ 1434 Fill the Cisterns!(计算几何,二分)

2012-08-13 23:55 429 查看
一些不同高度的水箱组成连通器,求装下V体积液体时液面的高度

将水箱按底部高排序。然后二分液面高度就可以了

//Memory: 1744 KB
//Time: 1391 MS
#include <stdio.h>
#include <algorithm>
using namespace std;
struct cistern
{
__int64 b,h,s;
__int64 v;
};cistern c[50004];
bool cmp(cistern a,cistern b)
{
return a.b<b.b;
}
int main()
{
int cas;
__int64 vol;
scanf("%d",&cas);
while(cas--)
{
int i,n;
__int64 w,d;
double sum=0,mid,low,high=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%I64d%I64d%I64d%I64d",&c[i].b,&c[i].h,&w,&d);
c[i].s=w*d;
c[i].v=c[i].s*c[i].h;
high=max(high,(double)(c[i].b+c[i].h));
sum+=c[i].v;
}
scanf("%I64d",&vol);
if(vol>sum)
{
printf("OVERFLOW\n");
continue;
}
sort(c,c+n,cmp);
low=c[0].b;
while(high-low>0.0001)
{
sum=0;
mid=(high+low)/2;
for(i=0;i<n;i++)
{
if(mid>=c[i].b+c[i].h)
sum+=c[i].v;
else if(mid>c[i].b)
sum+=(mid-c[i].b)*c[i].s;
if(mid<c[i].b)
break;
}
if(sum>=vol)
high=mid;
if(sum<vol)
low=mid;
}
printf("%.2lf\n",mid);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c ini