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 ...
随机推荐
- C语言I-博客作业04
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 C语言I博客作业04 我在这个课程的目标是 掌握使用for循环语句实现指定次数的循环程序设计 这个作业在那个具体方面帮助我实现目标 在编写 ...
- The kth great number
The kth great number Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. I ...
- P2672跳石头
这是2015noip的一道二分答案的题目,看了题解才会,, 题目给出石头的位置并且让你踩着石头往前跳,最多删掉m个石头还可以顺利通过,求解最短跳跃距离的最大值. 那么二分什么呢:mid为跳跃的长度.那 ...
- 剑指offer-序列化和反序列化二叉树-树-python
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先 ...
- VLAN原理详解[转载] 网桥--交换机---路由器
来自:http://blog.csdn.net/phunxm/article/details/9498829 一.什么是桥接 桥接工作在OSI网络参考模型的第二层数据链路层,是一种以 ...
- mv - 移动 (改名) 文件
摘要 mv [选项]... 源文件 目标文件 mv [选项]... 源文件... 目录 mv [选项]... --target-directory=DIRECTORY SOURCE... 描述 改“源 ...
- Django基础命令
创建工程 django-admin startproject 项目名创建应用 django-admin startapp 应用名 生成迁移 python3 manage.py makemigratio ...
- Linux服务器安装系统之1-LSI阵列卡raid5配置方法
- 02CSS
1.简介 从事网页制作或者相关工作,就要学习HTML,CSS.其中HTML是网页制作的主要语言网页的基础,CSS层叠样式表,主要用来修饰页面的元素 CSS 是 Cascading Style Shee ...
- APIO2019 题解
APIO2019 题解 T1 奇怪装置 题目传送门 https://loj.ac/problem/3144 题解 很容易发现,这个东西一定会形成一个环.我们只需要求出环的长度就解决了一切问题. 设环的 ...