POJ 1434 Fill the Cisterns! (模拟 or 二分)
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 二分)的更多相关文章
- poj1434 Fill the Cisterns!
地址:http://poj.org/problem?id=1434 题目:Fill the Cisterns! Fill the Cisterns! Time Limit: 5000MS Memo ...
- POJ 2723 Get Luffy Out(2-SAT+二分答案)
Get Luffy Out Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8851 Accepted: 3441 Des ...
- POJ 3414 Pots【bfs模拟倒水问题】
链接: http://poj.org/problem?id=3414 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22009#probl ...
- poj 1008:Maya Calendar(模拟题,玛雅日历转换)
Maya Calendar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64795 Accepted: 19978 D ...
- 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 ...
- POJ 1027 The Same Game(模拟)
题目链接 题意 : 一个10×15的格子,有三种颜色的球,颜色相同且在同一片内的球叫做cluster(具体解释就是,两个球颜色相同且一个球可以通过上下左右到达另一个球,则这两个球属于同一个cluste ...
- poj 1247 The Perfect Stall 裸的二分匹配,但可以用最大流来水一下
The Perfect Stall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16396 Accepted: 750 ...
- POJ 2010 Moo University - Financial Aid( 优先队列+二分查找)
POJ 2010 Moo University - Financial Aid 题目大意,从C头申请读书的牛中选出N头,这N头牛的需要的额外学费之和不能超过F,并且要使得这N头牛的中位数最大.若不存在 ...
- POJ 3233 Matrix Power Series (矩阵+二分+二分)
题目地址:http://poj.org/problem?id=3233 题意:给你一个矩阵A,让你求A+A^2+……+A^k模p的矩阵值 题解:我们知道求A^n我们可以用二分-矩阵快速幂来求,而 当k ...
随机推荐
- IDEA中解决 git pull 冲突
0.事先准备.1)把远程仓库的README.md内容改写为bbb(原先为aaa). 2)本地仓库的README.md内容改写为ccc(原先也为aaa). 以此来模仿代码冲突. 1.先commit ...
- 第八周zuoye
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪 https://edu.cnblogs.com/campus/zswxy/computer-scienceclass3-2018/homew ...
- 关于telnet的妙用
1 使用telnet查看某个端口是否可以访问
- 工具使用--Tomcat
一.Tomcat 服务搭建 1.进入apache官网下载tomcat 8.在左手边的菜单区,选择download下的tomcat8 版本: PS:操作系统,文件类型 2.将zip文件下载,解压到本地: ...
- babel的初步了解
前段时间开始研究ast,然后慢慢的顺便把babel都研究了,至于ast稍后的时间会写一篇介绍性博客专门介绍ast,本博客先介绍一下babel的基本知识点. 背景: 由于现在前端出现了很多非es5的语法 ...
- HDU 2196 Computer( 树上节点的最远距离 )
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Hive内部表,外部表和分区表
外部表和内部表的区别 内部表也称之为managed_table: 默认存储在/user/hive/warehouse下,也可以通过location指定: 删除表事,会删除表数据以及元数据: 外部表称之 ...
- 华为设备acl配置
拓扑图: 需求: 1.-vlan10内所有的主机,只能通过http访问vlan30-server的服务器;不能访问vlan40-server服务器2.-vlan20-pc1主机,可以访问vlan40- ...
- 常用的前端框架Angular、React、Vue
VUE 一.vue导读 1.1 vue的优点:结合其他框架点,轻量级,中文API,数据驱动,双向绑定,MVVM设计模式,组件化开发,单页面应用 1.2 vue环境的导入: 本地导入 <!--方法 ...
- 北京太速科技股份有限公司产品手册V201903020
如果您无法正常查看,请点击在线浏览 如果您无法正常查看,请点击在线浏览 了解更多产品信息,请扫描二维码,期待您的关注 ...