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 ...
随机推荐
- 前端 CSS 盒子模型 目录
CSS盒子模型介绍 padding border属性
- 关于连接池和DBUtils
1.关于数据库连接池 连接池就是创建和管理一个连接缓冲池的技术,这些连接好被任意线程所使用,数据库连接池负责分配和管理.释放数据库连接,总而言之数据库连接池就是提高对数据库的操作性能. 数据库连接池: ...
- merge into 导致序列跳号
For each row merged by a MERGE statement. The reference to NEXTVAL can appear in the merge_insert_cl ...
- Android的Monkey和MonkeyRunner
本文部分解释性语段摘自网络百科或其它BLOG,语句内容网络随处可见,也不知道谁是初始原创,便不再署名出处,如有雷同,还请见谅. Monkey 什么是Monkey Monkey是Android中的一个命 ...
- Nginx 2.安装与部署配置
转 https://www.cnblogs.com/wcwnina/p/8728430.html > 下载 官方网站:https://nginx.org/en/download.html Win ...
- Ubuntu终端路径和文件夹相互切换
一. 环境配置 1. 打开终端输入安装命令 sudo apt-get install nautilus-open-terminal 2. 重新加载文件管理器 nautilus -q 3. 重启电脑 s ...
- centos7使用kubeadm搭建kubernetes集群
一.本地实验环境准备 服务器虚拟机准备 IP CPU 内存 hostname 192.168.222.129 >=2c >=2G master 192.168.222.130 >=2 ...
- redis进阶知识
原文地址:https://my.oschina.net/u/4052893/blog/3001173 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis): 现在有个问题,如 ...
- [LeetCode] 164. 最大间距
题目链接 : https://leetcode-cn.com/problems/maximum-gap/ 题目描述: 给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值. 如果数组元素个数 ...
- CSS选择符有哪些?哪些属性可以继承
下面是一些常用的选择器: 1.id选择器( # myid) 2.类选择器(.myclassname) 3.标签选择器(div, h1, p) 4.相邻选择器(h1 + p) 5.子选择器(ul > ...