zoukankan      html  css  js  c++  java
  • poj1434 Fill the Cisterns!

    地址:http://poj.org/problem?id=1434

    题目:Fill the Cisterns!

    Fill the Cisterns!
    Time Limit: 5000MS   Memory Limit: 10000K
    Total Submissions: 4131   Accepted: 1360

    Description

    During the next century certain regions on earth will experience severe water shortages. The old town of Uqbar has already started to prepare itself for the worst. Recently they created a network of pipes connecting the cisterns that distribute water in each neighbourhood, making it easier to fill them at once from a single source of water. But in case of water shortage the cisterns above a certain level will be empty since the water will to the cisterns below. 


    You have been asked to write a program to compute the level to which cisterns will be lled with a certain volume of water, given the dimensions and position of each cistern. To simplify we will neglect the volume of water in the pipes. 


    Task 

    Write a program which for each data set: 

    reads the description of cisterns and the volume of water, 

    computes the level to which the cisterns will be filled with the given amount of water, 

    writes the result. 

    Input

    The first line of the input contains the number of data sets k, 1 <= k <= 30. The data sets follow. 

    The first line of each data set contains one integer n, the number of cisterns, 1 <= n <= 50 000. Each of the following n lines consists of 4 nonnegative integers, separated by single spaces: b, h, w, d - the base level of the cistern, its height, width and depth in meters, respectively. The integers satisfy 0 <= b <= 10^6 and 1 <= h * w * d <= 40 000. The last line of the data set contains an integer V - the volume of water in cubic meters to be injected into the network. Integer V satisfies 1 <= V <= 2 * 10^9. 

    Output

    The output should consist of exactly d lines, one line for each data set. 

    Line i, 1 <= i <= d, should contain the level that the water will reach, in meters, rounded up to two fractional digits, or the word 'OVERFLOW', if the volume of water exceeds the total capacity of the cisterns. 

    Sample Input

    3
    2
    0 1 1 1
    2 1 1 1
    1
    4
    11 7 5 1
    15 6 2 2
    5 8 5 1
    19 4 8 1
    132
    4
    11 7 5 1
    15 6 2 2
    5 8 5 1
    19 4 8 1
    78

    Sample Output

    1.00
    OVERFLOW
    17.00

    Source

     
    思路:
      二分
     1 #include <cstdio>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 
     8 #define MP make_pair
     9 #define PB push_back
    10 #define lc (o<<1)
    11 #define rc (o<<1|1)
    12 typedef long long LL;
    13 typedef pair<int,int> PII;
    14 const double eps=1e-8;
    15 const double pi=acos(-1.0);
    16 const int K=5e4+7;
    17 const int mod=1e9+7;
    18 
    19 struct node
    20 {
    21     double b,h,s;
    22     bool operator < (const node &ta) const
    23     {
    24         return b<ta.b;
    25     }
    26 }cis[K];
    27 int n;
    28 double v;
    29 int sgn(double ta,double tb)
    30 {
    31     if(fabs(ta-tb)<eps) return 0;
    32     return ta<tb?-1:1;
    33 }
    34 bool check(double x)
    35 {
    36     double ret=0;
    37     for(int i=1;i<=n;i++)
    38     {
    39         if(sgn(cis[i].b,x)>0)  break;
    40         ret+=cis[i].s*min(cis[i].h,x-cis[i].b);
    41     }
    42     return sgn(ret,v)>=0;
    43 }
    44 int main(void)
    45 {
    46     int t;
    47     scanf("%d",&t);
    48     while(t--)
    49     {
    50         scanf("%d",&n);
    51         double sum=0,l=1e9,r=-1e9;
    52         for(int i=1;i<=n;i++)
    53         {
    54             double b,h,w,d;
    55             scanf("%lf%lf%lf%lf",&b,&h,&w,&d);
    56             cis[i]=(node){b,h,w*d};
    57             sum+=h*w*d;
    58             l=min(l,b),r=max(r,b+h);
    59         }
    60         sort(cis+1,cis+1+n);
    61         scanf("%lf",&v);
    62         if(sgn(v,sum)>0)
    63         {
    64             printf("OVERFLOW
    ");
    65             continue;
    66         }
    67         while(r-l>0.001)
    68         {
    69             double mid=(l+r)/2;
    70             if(check(mid))
    71                 r=mid;
    72             else
    73                 l=mid;
    74         }
    75         printf("%.2f
    ",l);
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    jQuery Easing 动画效果扩展--使用Easing插件,让你的动画更具美感。
    JavaScript表达式--掌握最全的表达式,一切尽在掌握中,让表达不再是难事
    JavaScript的格式--从格式做起,做最严谨的工程师
    JavaScript 简介--对javascript的初识,最基础的了解
    手机web页面制作时的注意事项
    实现像淘宝一样牛的语音搜索框
    Cufon在渲染网页字体你不知道的事
    .net中单选按钮RadioButton,RadioButtonList 以及纯Html中radio的用法实例?
    使用C#把发表的时间改为几个月,几天前,几小时前,几分钟前,或几秒前
    eval解析JSON中的注意点
  • 原文地址:https://www.cnblogs.com/weeping/p/7652364.html
Copyright © 2011-2022 走看看