zoj 3913 Bob wants to pour water(二分)

2024-06-05 00:38
文章标签 二分 zoj bob water wants pour 3913

本文主要是介绍zoj 3913 Bob wants to pour water(二分),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:zoj 3913 Bob wants to pour water

解题思路

二分高度,判断容量。

代码

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;
const int maxn = 1e5 + 5;
const double eps = 1e-8;
const double pi = 4 * atan(1);inline int dcmp(double x) {if (fabs(x) < eps) return 0;return x < 0 ? -1 : 1;
}struct Rectangle {double z, w, l, h;void read () { scanf("%lf%lf%lf%lf", &z, &w, &l, &h); }double volume () { return w * l * h; }double contain(double H) {double dn = z-h/2, up = min(z+h/2, H);return w * l * max(0.0, up-dn);}
}R[maxn];struct Circle {double z, r;void read () { scanf("%lf%lf", &z, &r); }double volume () { return pow(r, 3) * pi * 4 / 3; }double lost(double H) { return pi * H * H * (r - H / 3); }double contain(double H) {if (dcmp(H-(z+r)) >= 0) return volume();if (dcmp(H-(z-r)) <= 0) return 0;if (dcmp(H-z) >= 0) return volume()-lost(z+r-H);else return lost(H-(z-r));}
}C[maxn];int M, N;
double W, L, V;double getVolume(double H) {double ret = H * W * L;for (int i = 0; i < M; i++)ret -= R[i].contain(H);for (int i = 0; i < N; i++)ret -= C[i].contain(H);return ret;
}double solve () {double l = 0, r = V / (W*L);for (int i = 0; i < M; i++) r += R[i].volume()/(W*L);for (int i = 0; i < N; i++) r += C[i].volume()/(W*L);//while (r-l > 1e-4) {for (int i = 0; i < 200; i++) {double mid = (l + r) / 2;double vol = getVolume(mid);if (dcmp(vol-V) > 0) r = mid;else l = mid;}return l;
}int main () {int cas;scanf("%d", &cas);while (cas--) {scanf("%lf%lf%lf%d%d", &W, &L, &V, &M, &N);for (int i = 0; i < M; i++) R[i].read();for (int i = 0; i < N; i++) C[i].read();printf("%.6lf\n", solve());}return 0;
}

这篇关于zoj 3913 Bob wants to pour water(二分)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031580

相关文章

二分查找(算法篇)

算法之二分查找 二分查找 概念: 针对于已经预先排序好的数据,每次将数据进行对半查找,然后看它中间的数据是否是要找的,如果是就返回中间位置,不是就判断该数据是在前半部分还是后半部,然后在进而取其中部,看其是否找到,然后如果还没找到就一直重复操作,直到找到为止,该算法时间复杂度为O(logn) 代码: int search(vector<int>& nums, int target) {i

C语言实现简单二分搜索和四个变体问题

二分查找 简单的二分查找 简单指的是在不存在重复元素的数组中,查找值等于给定值的情况。 int bsearch(int *arr, int n, int value){int low = 0;int high = n - 1;int mid;while (low <= high){mid = low + ((high-low) >> 1);if (arr[mid] == value){re

leetcode 二分查找·系统掌握 x的平方根

题目: 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l=0,r=x,mid;while(l<r){mid=(l+r+1)>>1;if(mid*mid>x)r=mid-1;else l=mid;}//因为一定有答案所以不用判定是否查找失败return l;}

leetcode 二分查找·系统掌握 第一个错误版本

题意: 题解: 就是经典的~01~泛型查找,而且一定存在这样错误的版本所以查找不会"失败",返回每次查找结果即可。 int firstBadVersion(int n) {long l=1,r=n,mid;while(l<r){mid=(l+r)>>1;if(isBadVersion(mid))r=mid;else l=mid+1;}return l;}

leetcode 二分查找·系统掌握 搜索二维矩阵

题目: 题解: 一个可行的思路是使用~01~泛型对每一行的最后一个元素进行查找找到第一个大于等于target的那一行,判断查找结果如果“失败”返回false否则继续在改行进行常规二分查找target的值根据查找结果返回即可。 bool searchMatrix(vector<vector<int>>& matrix, int target) {int l=0,r=matrix.size()-

微策略面试题:在旋转后的数组中查找元素(二分查找)

版权所有。所有权利保留。 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/17123303 一个无重复元素的有序数组,经过若干次旋转后,得到一个新数组。比如[1,4,5,8,10,12,56,78]变成[12,56,78,1,4,5,8,10]。 现在要在这个数组中寻找元素。 其实算法很简单,就是用二分

素数伴侣--最大二分匹配

#include<bits/stdc++.h>using namespace std;#define N 100int edge[N][N],cx[N],cy[N];//edge记录两点的关系,如果两点相连,则edge【i】【j】为1int visited[N];//判断该店是否被访问过int nx,ny,res;const int M=60000+100;bool prim[M];

【秋招刷题打卡】Day02-二分系列之-二分查找

Day02-二分系列之-二分查找 前言 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦,详细介绍 =>笔试刷题陪伴小屋-打卡赢价值丰厚奖励 <= ⏰小屋将在每日上午发放打卡题目,包括: 一道该算法的模版题 (主要以力扣,牛客,acwing等其他OJ网站的题目作为模版)一道该算法的应用题(主要以往期互联网大厂 笔试真题 的形式出现,评测在咱们的 笔试突围OJ) 小屋day02 我们预

Day1:二分查找704 移除元素27

题目链接704. 二分查找 - 力扣(LeetCode) int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1;int mid = (right - left) / 2;while (left <= right){if (target == nums[mid]){retu

[HDU 4334] Trouble (分治+二分查找)

HDU - 4334 给你五个数组,每组 N个元素 (N<=200) 问是否能在五个数组里各选一个数,使得和为0 思路是分治,然后再二分查找,降低复杂度 1) 算出 S1 S_1和 S2 S_2所有元素的和的情况并排序,对 S3 S_3和 S4 S_4亦是如此 O( N2 N^2) 2) 枚举 S3 S_3和 S4 S_4的和数组与 S5 S_5的和的情况 再在 S1 S