Fill the Cisterns!

题目链接:

http://acm.hust.edu.cn/vjudge/contest/129783#problem/F

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

Output


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

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


2016-HUST-线下组队赛-3


##题意:

给出n个长方体水箱,从下往上依次注入V升水. 求最后结果的高度.


##题解:

对长方体的上下底面排序后直接模拟即可,维护当前高度时长方体的截面面积之和. 每次枚举到下底时把面积加入,枚举到下底时减去面积.
当枚举到某个上底时,水不够注满到这个高度,那么用剩余体积除以当前截面,就是剩下的高度.
还有种做法是二分最终高度,并遍历所有长方体计算是否能够用.

这道水题成为了今天的败笔. 2个多小时才过.
一开始就想的是二分,然后我特意处理都乘了个100来避免浮点数. 结果WA. 应该是因为可能不能恰好用完导致的.
然后改成double的还是WA. 后来重写了一份模拟,还是WA.
错点在于,一开始把rounded up错误理解成为向上取整,结果每次输出我都加了个0.005导致GG.
模拟过了之后以为二分的精度不够,这题不能用二分. 回来补题才发现输出一定只能用 %f , 不能用 %lf. (否者WA,至于精度,各种姿势处理都能过).

double输出再用%lf就吃键盘!!!!!


##代码:
####模拟:
``` cpp
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#define eps 1e-8
#define maxn 50010
#define mod 100000007
#define inf 0x3f3f3f3f3f3f3f3f
#define mid(a,b) ((a+b)>>1)
#define IN freopen("in.txt","r",stdin);
using namespace std;

int n;

LL V;

struct node {

LL b,h,w,d;

}p[maxn];

bool vis[maxn];

typedef pair<LL,int> pii;

pii edge[maxn*2];

int main(int argc, char const *argv[])

{

//IN;

int t; cin >> t;
while(t--)
{
scanf("%d", &n);
int cnt = 0;
for(int i=1; i<=n; i++) {
scanf("%I64d %I64d %I64d %I64d", &p[i].b, &p[i].h, &p[i].w, &p[i].d);
edge[++cnt] = make_pair(p[i].b, i);
edge[++cnt] = make_pair(p[i].b + p[i].h, i);
}
scanf("%I64d", &V); sort(edge+1, edge+1+2*n);
memset(vis, 0, sizeof(vis));
LL area = 0;
LL ans = edge[1].first;
double last = inf;
for(int i=1; i<=2*n; i++) {
LL top = edge[i].first;
int num = edge[i].second; if((top-ans)*area >= V) {
last = (double)V / (double)area;
V = 0;
break;
} if(vis[num]) {
V -= area * (top-ans);
area -= p[num].w*p[num].d;
ans = top;
} else {
V -= area * (top-ans);
area += p[num].w*p[num].d;
vis[num] = 1;
ans = top;
}
} if(V > 0) printf("OVERFLOW\n");
else {
printf("%.2f\n", last+(double)ans);
}
} return 0;

}

####二分:

include

include

include

include

include

include

include

include

include

include

include

define LL long long

define eps 1e-8

define maxn 50010

define mod 100000007

define inf 0x3f3f3f3f

define mid(a,b) ((a+b)>>1)

define IN freopen("in.txt","r",stdin);

using namespace std;

int n;

double V;

struct node {

double b,h,w,d;

bool operator < (const node& B) const {

return b < B.b;

}

}p[maxn];

double cal(double dep) {

double ret = V;

for(int i=1; i<=n && dep>=p[i].b; i++) {

if(dep >= p[i].b + p[i].h) ret -= p[i].h * p[i].w * p[i].d;

else ret -= (dep - p[i].b) * p[i].w * p[i].d;

if(ret < 0) break;

}

return ret;

}

int main(int argc, char const *argv[])

{

//IN;

int t; cin >> t;
while(t--)
{
scanf("%d", &n);
double L = inf, R = -inf;
for(int i=1; i<=n; i++) {
scanf("%lf %lf %lf %lf", &p[i].b, &p[i].h, &p[i].w, &p[i].d);
L = min(L, p[i].b);
R = max(R, p[i].b + p[i].h);
}
scanf("%lf", &V); double tmp = V;
for(int i=1; i<=n; i++) {
tmp -= p[i].h*p[i].w*p[i].d;
if(tmp < 0) break;
} if(tmp > 0) {
printf("OVERFLOW\n");
continue;
} sort(p+1, p+1+n); double mid;
double ans = inf;
while(L <= R) {
mid = (L + R) / 2.0;
double cur = cal(mid);
if(cur <= 0) {
if(fabs(cur) < eps) ans = min(ans, mid);
R = mid - 0.001;
}
else L = mid + 0.001;
}
ans = min(ans, mid); printf("%.2f\n", ans);
} return 0;

}

POJ 1434 Fill the Cisterns! (模拟 or 二分)的更多相关文章

  1. poj1434 Fill the Cisterns!

    地址:http://poj.org/problem?id=1434 题目:Fill the Cisterns! Fill the Cisterns! Time Limit: 5000MS   Memo ...

  2. POJ 2723 Get Luffy Out(2-SAT+二分答案)

    Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8851   Accepted: 3441 Des ...

  3. POJ 3414 Pots【bfs模拟倒水问题】

    链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...

  4. poj 1008:Maya Calendar(模拟题,玛雅日历转换)

    Maya Calendar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64795   Accepted: 19978 D ...

  5. Poj 3233 Matrix Power Series(矩阵二分快速幂)

    题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k ...

  6. POJ 1027 The Same Game(模拟)

    题目链接 题意 : 一个10×15的格子,有三种颜色的球,颜色相同且在同一片内的球叫做cluster(具体解释就是,两个球颜色相同且一个球可以通过上下左右到达另一个球,则这两个球属于同一个cluste ...

  7. poj 1247 The Perfect Stall 裸的二分匹配,但可以用最大流来水一下

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16396   Accepted: 750 ...

  8. POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)

    POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...

  9. POJ 3233 Matrix Power Series (矩阵+二分+二分)

    题目地址:http://poj.org/problem?id=3233 题意:给你一个矩阵A,让你求A+A^2+……+A^k模p的矩阵值 题解:我们知道求A^n我们可以用二分-矩阵快速幂来求,而 当k ...

随机推荐

  1. 实验报告5&第七周课程总结

    实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...

  2. 语言I—2019秋作业02

    这个作业属于那个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 参考文献 C语言程序设计I https://edu.cnblogs.com/campus/zswx ...

  3. 掌握这些 Redis 技巧,百亿数据量不在话下!

    一.Redis封装架构讲解 实际上NewLife.Redis是一个完整的Redis协议功能的实现,但是Redis的核心功能并没有在这里面,而是在NewLife.Core里面. 这里可以打开看一下,Ne ...

  4. [Codeforces 1214A]Optimal Currency Exchange(贪心)

    [Codeforces 1214A]Optimal Currency Exchange(贪心) 题面 题面较长,略 分析 这个A题稍微有点思维难度,比赛的时候被孙了一下 贪心的思路是,我们换面值越小的 ...

  5. Delphi中各个包中包含的控件

    经常有朋友提这样的问题,“我原来在delphi5或者delphi6中用的很熟的控件到哪里去了?是不是在delphi7中没有了呢?这是不是意味着我以前写的代码全都不能够移植到delphi7中来了呢?是不 ...

  6. P2218 [HAOI2007]覆盖问题

    传送门 首先可以想到二分答案,然后考虑判断 注意到所有点的外包矩形的四条边一定要被覆盖到,而正方形只有 $3$ 个,所以一定有一个正方形在角落 考虑爆搜,枚举正方形在当前外包矩形的那个角,然后对剩下的 ...

  7. Linux安装 jdk&maven

    JDK安装 1. 下载JDK压缩包http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  8. windows 桌面背景设置实例

    应用SystemParametersInfo函数可以获取和设置数量众多的windows系统参数.这个小程序就是运用了SystemParametersInfo函数来设置桌面的墙纸背景,而且程序可以让我们 ...

  9. 第7天:Django模板使用与表单

    模板的配置 作为web框架,Django提供了模板,用于编写html代码,模板的设计实现了业务逻辑view与现实内容template的解耦.模板包含两部分: 静态部分: 包含html.css.js 动 ...

  10. SEM和SEO的区别?

    https://www.zhihu.com/question/20307058 SEM在营销中扮演的角色:进攻 搜索引擎营销,即SEM(Search Engine Marketing),是基于搜索引擎 ...