poj3334Connected Gheeves(二分)
二分高度,算面积的地方有点麻烦,没有用求交点的模板,直接自己按三角形相似手算了一下,写的有点麻烦。
上下界直接取水可放的最高点以及最低点。
自己的长得很挫的代码
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 2010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct point
{
double x ,y;
point(double x=,double y=):x(x),y(y){}
}p[N],q[N],ch[N];
double minz;
int n,m;
typedef point pointt;
pointt operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
double dis(point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
}
double getarea(int n,point p[])
{
int i;
double s = ;
for(i = ; i < n ; i++)
s+=cross(p[i]-p[],p[i+]-p[]);
return s/;
}
double cal(double r,point p[],int n)
{
int i,j;
int k = ;
for(i = ; i <= n; i++)
if(p[i].y<p[k].y) k = i; if(dcmp(r-p[k].y)<=) return 0.0; point p1,p2;
int g = ;
for(i = ; i < k; i++)
if(dcmp(p[i].y-r)>=&&dcmp(p[i+].y-r)<)
{
p1.y = r;
double d = r-p[i+].y;
p1.x = d*(p[i].x-p[i+].x)/(p[i].y-p[i+].y)+p[i+].x;
break;
} for(j = k ; j >= i+; j--)
ch[++g] = p[j];
ch[++g] = p1;
for(i = k+ ; i <= n; i++)
if(dcmp(p[i-].y-r)<&&dcmp(p[i].y-r)>=)
{
p2.y = r;
double d = r-p[i-].y;
p2.x = d*(p[i].x-p[i-].x)/(p[i].y-p[i-].y)+p[i-].x;
break;
}
ch[++g] = p2;
for(j = i- ; j > k; j--)
ch[++g] = p[j]; return fabs(getarea(g,ch));
}
int main()
{
int t,i,a;
cin>>t;
while(t--)
{
scanf("%d",&a);
scanf("%d",&n);
minz = INF;
double maxz = INF;
for(i = ; i <= n ;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
maxz = min(maxz,p[i].y);
}
scanf("%d",&m);
for(i = ; i <= m ;i++)
{
scanf("%lf%lf",&q[i].x,&q[i].y);
maxz = min(maxz,p[i].y);
}
minz = min(min(p[].y,p[n].y),min(q[].y,q[m].y));
double lef = maxz,rig = minz,mid;
while(fabs(rig-lef)>eps)
{
mid = (rig+lef)/2.0;
double s1 = cal(mid,p,n),s2 = cal(mid,q,m);
if(dcmp(s1+s2-a)>)
rig = mid;
else lef = mid;
}
printf("%.3f\n",lef);
}
return ;
}
感觉不错的别人的代码
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 2010
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct point
{
double x ,y;
point(double x=,double y=):x(x),y(y){}
}p[N],q[N],ch[N];
double minz;
typedef point pointt;
pointt operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
}
int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
double dis(point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
double cross(point a,point b)
{
return a.x*b.y-a.y*b.x;
} double getarea(int n,point p[])
{
int i;
double s = ;
for(i = ; i < n- ; i++)
s+=cross(p[i]-p[],p[i+]-p[]);
return s/;
}
//double cal(double r,point p[],int n)
//{
// int i,j;
// int k = 1;
// for(i = 1; i <= n; i++)
// if(p[i].y<p[k].y) k = i;
//
// r = min(r,minz);
// if(dcmp(r-p[k].y)<=0) return 0.0;
//
// point p1,p2;
// int g = 0;
// for(i = 1; i < k; i++)
// if(dcmp(p[i].y-r)>=0&&dcmp(p[i+1].y-r)<0)
// {
// p1.y = r;
// double d = r-p[i+1].y;
// p1.x = d*(p[i].x-p[i+1].x)/(p[i].y-p[i+1].y)+p[i+1].x;
// break;
// }
// // cout<<p1.x<<" "<<p1.y<<endl;
// for(j = k ; j >= i+1; j--)
// ch[++g] = p[j];
// ch[++g] = p1;
// for(i = k+1 ; i <= n; i++)
// if(dcmp(p[i-1].y-r)<0&&dcmp(p[i].y-r)>=0)
// {
// p2.y = r;
// double d = r-p[i-1].y;
// p2.x = d*(p[i].x-p[i-1].x)/(p[i].y-p[i-1].y)+p[i-1].x;
// break;
// }
// ch[++g] = p2;
// for(j = i-1 ; j > k; j--)
// ch[++g] = p[j];
//
// return fabs(getarea(g,ch));
//}
point intersect(point p1,point p2,point p3,point p4){
point p;
double a1,b1,a2,b2,c1,c2,d;
a1=p1.y-p2.y; b1=p2.x-p1.x; c1=p1.x*p2.y-p2.x*p1.y;
a2=p3.y-p4.y; b2=p4.x-p3.x; c2=p3.x*p4.x-p4.x*p3.y;
d=a1*b2-a2*b1;
p.x=(-c1*b2+c2*b1)/d;
p.y=(-a1*c2+a2*c1)/d;
return p;
}
bool pan(point a,point b,double y){
return dcmp(a.y-y)*dcmp(b.y-y)<=;
}
double cal(double y,point P[],int n){ int i,j,k;
int tot=;
point a=point(,y),b=point(,y);
for(i=;i<n;i++){
if(pan(P[i],P[i+],y)){
ch[tot++]=intersect(P[i],P[i+],a,b);
break;
}
}
for(j=i+;j<n;j++){
ch[tot++]=P[j];
if(pan(P[j],P[j+],y)){
ch[tot++]=intersect(P[j],P[j+],a,b);
break;
}
}
double area=getarea(tot,ch);
return area;
}
int main()
{
int t,i,a,n,m;
cin>>t;
while(t--)
{
scanf("%d",&a);
scanf("%d",&n);
minz = INF;
for(i = ; i <= n ;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
minz = min(minz,p[i].y);
}
scanf("%d",&m);
for(i = ; i <= m ;i++)
{
scanf("%lf%lf",&q[i].x,&q[i].y);
minz = min(minz,q[i].y);
}
double maxz = min(min(p[].y,p[n].y),min(q[].y,q[m].y));
double lef = minz,rig = maxz,mid;
while(fabs(rig-lef)>eps)
{
mid = (rig+lef)/2.0;
double s1 = cal(mid,p,n),s2 = cal(mid,q,m);
if(dcmp(s1+s2-a)>)
rig = mid;
else lef = mid;
}
printf("%.3f\n",lef);
}
return ;
}
poj3334Connected Gheeves(二分)的更多相关文章
- poj3334(Connected Gheeves)
Connected Gheeves Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 1008 Accepted: 368 ...
- poj 3334 Connected Gheeves (Geometry + BInary Search)
3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水.它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出.开始的时候打 ...
- BZOJ1012: [JSOI2008]最大数maxnumber [线段树 | 单调栈+二分]
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 8748 Solved: 3835[Submi ...
- BZOJ 2756: [SCOI2012]奇怪的游戏 [最大流 二分]
2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 3352 Solved: 919[Submit][Stat ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- [bzoj2653][middle] (二分 + 主席树)
Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序列s. 回答Q个这样的询问:s的左端点在[a,b ...
- [LeetCode] Closest Binary Search Tree Value II 最近的二分搜索树的值之二
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- [LeetCode] Closest Binary Search Tree Value 最近的二分搜索树的值
Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...
- jvascript 顺序查找和二分查找法
第一种:顺序查找法 中心思想:和数组中的值逐个比对! /* * 参数说明: * array:传入数组 * findVal:传入需要查找的数 */ function Orderseach(array,f ...
随机推荐
- POJ 3026 : Borg Maze(BFS + Prim)
http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions ...
- IO流认识
处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写能力. BufferedWriter/BufferedReader(缓冲流)是处理流中的一种 OutputS ...
- Ecshop后台订单列表增加”商品名”检索字段
近期ecshop网站做活动,统计商品订单量的时候没有按商品名搜索的选项,只能手动查询.这样效率很低下,而且容易出错. 现在为列表增加一个简单的“按商品名搜索”表单项.效果如下图 涉及到2个文件,分别是 ...
- 每日一九度之 题目1076:N的阶乘
时间限制:3 秒 内存限制:128 兆 特殊判题:否 提交:7601 解决:2749 题目描述: 输入一个正整数N,输出N的阶乘. 输入: 正整数N(0<=N<=1000) 输出: 输入可 ...
- 每日一九度之 题目1030:毕业bg
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2046 解决:894 题目描述: 每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为“bg”.参加不同团体的b ...
- 每日一九度之 题目1023:EXCEL排序
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:18804 解决:4240 题目描述: Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. 对每个测试用例 ...
- SQLite不支持的SQL语法总结
1 TOP 这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录: SELECT TOP 10 * FROM [index] ORDER BY indexi ...
- c++ list, vector, map, set 区别与用法比较
http://blog.csdn.net/alex_xhl/article/details/37692297 List封装了链表,Vector封装了数组, list和vector得最主要的区别在于ve ...
- PKCS10生成证书csr
public static String genCSR(String subject, String alg,String provider) throws InvalidKeyException, ...
- 怎样实现UIView的旋转
首先创建界面,在viewDidLoad创建view以及button 相关代码如下 -(void)viewDidLoad { [super viewDidLoad]; viewDemo = [[UIVi ...