Aquarium Tank(csu1634+几何+二分)Contest2087 - 湖南多校对抗赛(2015.05.24)-G
Aquarium Tank
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 15 Solved: 4
[Submit][Status][Web Board]
Description
You just bought an “artistic” aquarium tank that has an interesting shape, and you poured L litres of water into the tank. How high is the water in the tank?
When you look at this tank from one side, it has the shape of a convex polygon. This polygon has exactly two vertices on the table (y-coordinates are 0), and all other vertices have positive y-coordinates. There are also exactly two vertices with maximum y-coordinates, and water is poured into the opening between these two vertices. This aquarium tank has a depth of D centimetres. The tank is glued to the table, so no matter what shape it has, it keeps its position and does not tip over. All coordinates and lengths in this problem are given in centimetres. It should be noted that each cubic metre is equivalent to 1 000 litres.
An illustration showing the configuration of the tank of the first sample input is given below:
Input
The input consists of a single test case. The first line contains an integer N (4 ≤ N ≤ 100) giving the number of vertices in the polygon. he next line contains two integers D and L, where 1 ≤ D ≤ 1000 is he depth of the aquarium tank and 0 L 2 000 is the number of litres f water to pour into the tank. The next N lines each contains two integers, giving the (x, y) coordinates of the vertices of the convex polygon in counterclockwise order. The absolute values of x and y are at most 1 000. You may assume that the tank has a positive capacity, and you never pour more water than the tank can hold.
Output
Print the height of the water (in centimetres) in the aquarium tank on a line to 2 decimal places.
Sample Input
4
30 50
20 0
100 0
100 40
20 40
Sample Output
20.83
HINT
Source
题意:有一个横放是多边形的棱柱。问L升水,注入其中,容器的深度是多少。
思路:棱柱的体积等于底面积成高,so、、、我可以二分多边形的高度(用平行与X轴的直线求切割多边形)取下半部分是面积;
坑!比赛的时候,我以为第一组边一定是在x轴上的。。。o(︶︿︶)o 唉,结果是一定有一组边在x轴上,但不一定是第一组!。。。
转载请注明出处:寻找&星空の孩子
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1634
比较乱,没整理!
#include<cstdio>
#include<cmath>
#include<iostream>
#define PI acos(-1.0)
using namespace std; struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y) {} }; double hmax;
double D,L; typedef Point Vector;//Vector只是Point的别名 //向量+向量=向量; 向量+点=点
Vector operator + (Vector A,Vector B)
{
return Vector(A.x+B.x,A.y+B.y);
} //点-点=向量
Vector operator - (Point A,Point B)
{
return Vector(A.x-B.x,A.y-B.y);
} //向量*数=向量
Vector operator * (Vector A,double p)
{
return Vector(A.x*p,A.y*p);
} //向量/数=向量
Vector operator / (Vector A,double p)
{
return Vector(A.x/p,A.y/p);
} //
bool operator < (const Point& a,const Point& b)
{
return a.x<b.x||(a.x==b.x && a.y<b.y);
} //
const double eps = 1e-;
//三态函数
int dcmp(double x)
{
if(fabs(x)<eps)return ;
else return x < ? - : ;
}
//相等
bool operator == (const Point& a,const Point& b)
{
return dcmp(a.x-b.x)== && dcmp(a.y-b.y)==;
} double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
double length(Vector A)
{
return sqrt(Dot(A,A));
}
double Angle(Vector A,Vector B)
{
return acos(Dot(A,B)/length(A)/length(B));
} double Cross(Vector A,Vector B)
{
return A.x*B.y-B.x*A.y;
}
double Area2(Point A,Point B,Point C)
{
return Cross(B-A,C-A);
} double PArea(Point *p,int n)
{
double area=;
for(int i=; i<n; i++)
{
area+=Cross(p[i],p[(i+)%n]);
// printf("area=%f\n",area);
}
return fabs(area/);
} /*******两直线交点*******/
//调用前确保两条直线P+tv和Q+tv有唯一交点,当且仅当Cross(v,w)非0;
Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)
{
Vector u=P-Q;
// printf("P=(%f,%f),v=(%f,%f),Q=(%f,%f),w=(%f,%f)\n",P.x,P.y,v.x,v.y,Q.x,Q.y,w.x,w.y);
// if(Cross(v,w))
// {
// double t=Cross(w,u)/Cross(v,w);//精度高的时候,考虑自定义分数类
// return P+v*t;
// }
// else
// return ;
//printf("t= %lf\t%lf",Cross(w,u),Cross(v,w));
return P+v*Cross(w,u)/Cross(v,w);
}
//输入函数
Point read_point(Point &P)
{
scanf("%lf%lf",&P.x,&P.y);
hmax=max(hmax,P.y);
return P;
}
Point get_point(Point a, Point b, double y0)
{
if(fabs(a.x - b.x) < eps) return Point(a.x, y0);
double bi = (y0 - a.y) / (b.y - a.y);
return Point(a.x + bi * (b.x - a.x), a.y + bi * (b.y - a.y));
}
int main()
{
Point po[],Q[];
int T,n,q,i; // freopen("debug//secret-tank-03.in","r",stdin);
while(scanf("%d",&n)!=EOF)
{
scanf("%lf%lf",&D,&L);
hmax=;
for(i=; i<n; i++)
{
read_point(po[i]);
// printf("----[%lf]\n",po[i]);
}
// po[n]=po[0];
// po[n+1]=po[1];
// Q[0]=po[0];
// Q[1]=po[1];
// printf("Q[%d]=%lf\n\n",1,po[1]);
double d=,h=hmax;
while(h-d>eps)
{
q=;
int per=n-;
double m=(d+h)/;
// printf("m=%lf\n",m);
// getchar();
Point M(,m);
Vector w(,);
for(int i=; i<n; i++)
{
// if(i==0&&(m-po[i].y)>eps){Q[q++]=po[i];continue;} // else if((m-po[i].y)==eps)
// {
// Q[q++]=po[i];
// }
if((m-po[i].y)*(m-po[per].y)<eps)
{
// printf("------------------------------------------------------\n");
// Vector PP=po[i]-po[per];
// Q[q++]=GetLineIntersection(po[per],PP,M,w);
Q[q++]=get_point(po[i],po[per],m);
}
if((m-po[i].y)>eps)
{
// if(i==1) Q[q++]=po[i-1];
Q[q++]=po[i];
}
per=i;
// printf("Q[%d]=(%f,%f)\n",q-1,Q[q-1].x,Q[q-1].y);
}
// Q[q]=Q[0];
// if(m==20)
// for(int i=0;i<q;i++)
// {
// printf("Q[%d]=(%f,%f)\n",i,Q[i].x,Q[i].y);
// }
double area=PArea(Q,q);
// printf("L=%f\tV=%lf\tm=%lf\n",L*1000,area*D,m);
if(L*-area*D>eps) d=m;
else h=m; }
printf("%.2f\n",d);
}
return ;
} /**************************************************************
Problem: 1634
User: aking2015
Language: C++
Result: Accepted
Time:0 ms
Memory:1496 kb
****************************************************************/
好吧。发个整理过的。
#include<cstdio>
#include<cmath>
#include<iostream>
#define PI acos(-1.0)
using namespace std; struct Point
{
double x,y;
Point(double x=,double y=):x(x),y(y) {} }; double hmax;
double D,L; typedef Point Vector; Vector operator + (Vector A,Vector B)
{
return Vector(A.x+B.x,A.y+B.y);
} Vector operator - (Point A,Point B)
{
return Vector(A.x-B.x,A.y-B.y);
} Vector operator * (Vector A,double p)
{
return Vector(A.x*p,A.y*p);
} Vector operator / (Vector A,double p)
{
return Vector(A.x/p,A.y/p);
} bool operator < (const Point& a,const Point& b)
{
return a.x<b.x||(a.x==b.x && a.y<b.y);
} const double eps = 1e-; int dcmp(double x)
{
if(fabs(x)<eps)return ;
else return x < ? - : ;
}
bool operator == (const Point& a,const Point& b)
{
return dcmp(a.x-b.x)== && dcmp(a.y-b.y)==;
} double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
double length(Vector A)
{
return sqrt(Dot(A,A));
}
double Angle(Vector A,Vector B)
{
return acos(Dot(A,B)/length(A)/length(B));
} double Cross(Vector A,Vector B)
{
return A.x*B.y-B.x*A.y;
}
double Area2(Point A,Point B,Point C)
{
return Cross(B-A,C-A);
} double PArea(Point *p,int n)
{
double area=;
for(int i=; i<n; i++)
{
area+=Cross(p[i],p[(i+)%n]);
}
return fabs(area/);
} Point GetLineIntersection(Point P,Vector v,Point Q,Vector w)
{
Vector u=P-Q;
return P+v*Cross(w,u)/Cross(v,w);
}
Point read_point(Point &P)
{
scanf("%lf%lf",&P.x,&P.y);
hmax=max(hmax,P.y);
return P;
}
Point get_point(Point a, Point b, double y0)
{
if(fabs(a.x - b.x) < eps) return Point(a.x, y0);
double bi = (y0 - a.y) / (b.y - a.y);
return Point(a.x + bi * (b.x - a.x), a.y + bi * (b.y - a.y));
}
int main()
{
Point po[],Q[];
int T,n,q,i;
while(scanf("%d",&n)!=EOF)
{
scanf("%lf%lf",&D,&L);
hmax=;
for(i=; i<n; i++)
{
read_point(po[i]);
}
double d=,h=hmax;
while(h-d>eps)
{
q=;
int per=n-;
double m=(d+h)/;
Point M(,m);
Vector w(,);
for(int i=; i<n; i++)
{
if((m-po[i].y)*(m-po[per].y)<eps)
{
Vector PP=po[i]-po[per];
Q[q++]=GetLineIntersection(po[per],PP,M,w);
// Q[q++]=get_point(po[i],po[per],m);
}
if((m-po[i].y)>eps)
{
Q[q++]=po[i];
}
per=i;
}
double area=PArea(Q,q);
if(L*-area*D>eps) d=m;
else h=m;
}
printf("%.2f\n",d);
}
return ;
} /**************************************************************
Problem: 1634
User: aking2015
Language: C++
Result: Accepted
Time:0 ms
Memory:1500 kb
****************************************************************/
Aquarium Tank(csu1634+几何+二分)Contest2087 - 湖南多校对抗赛(2015.05.24)-G的更多相关文章
- Contest2071 - 湖南多校对抗赛(2015.03.28)
Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.csu.edu.cn/OnlineJudge/contest.php?c ...
- Contest2073 - 湖南多校对抗赛(2015.04.06)
Contest2073 - 湖南多校对抗赛(2015.04.06) Problem A: (More) Multiplication Time Limit: 1 Sec Memory Limit: ...
- 湖南多校对抗赛(2015.05.03)Problem A: Twenty-four point
给四个数 问能不能算出24点...我的方法比较烂...920ms 差点TLE.应该有更好的方法. #include<stdio.h> #include<string.h> #i ...
- 湖南多校对抗赛(2015.05.03)Problem B: War
并查集.从后往前加边. #include<stdio.h> #include<string.h> #include<math.h> #include<algo ...
- Contest2089 - 湖南多校对抗赛(2015.05.31) Swipe(csu1648)
Problem E: Swipe Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 100 Solved: 15[Submit][Status][Web ...
- Heaps(Contest2080 - 湖南多校对抗赛(2015.05.10)(国防科大学校赛决赛-Semilive)+scu1616)
Problem H: Heaps Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 48 Solved: 9[Submit][Status][Web Bo ...
- Clock Pictures(kmp + Contest2075 - 湖南多校对抗赛(2015.04.26))
Problem H: Clock Pictures Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 73 Solved: 18[Submit][Stat ...
- CSU 2136 ——湖南多校对抗赛 I
2136: 统帅三军! Submit Page Summary Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 55 ...
- hdu6097[二分+解析几何] 2017多校6
/*hdu6097[二分+解析几何] 2017多校6*/ #include <bits/stdc++.h> using namespace std; ; struct node{ doub ...
随机推荐
- 《HTTP权威指南》3-HTTP报文
报文流 HTTP报文是在HTTP应用程序之间发送的数据块,这些数据块以文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分.这些报文在客户端,服务器和代理之间流动. 报文的组成 ...
- unigui+fastreport报表打印
unigui+fastreport报表打印 unigui+fastreport报表打印 FASTREPORT导出成PDF报表,UNIGUI的TUniURLFrame显示PDF报表并打印. func ...
- 全国计算机等级考试二级Python语言程序设计考试大纲
全国计算机等级考试二级Python语言程序设计考试大纲(2018年版) 基本要求 掌握Python语言的基本语法规则. 掌握不少于2个基本的Python标准库. 掌握不少于2个Python第三方库,掌 ...
- python爬虫学习之日志记录模块
这次的代码就是一个日志记录模块,代码很容易懂,注释很详细,也不需要安装什么库.提供的功能是日志可以显示在屏幕上并且保存在日志文件中.调用的方式也很简单,测试代码里面有. 源代码: #encoding= ...
- ElasticSearch是如何实现分布式的?
面试题 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 面试官心理分析 在搜索这块,lucene 是最流行的搜索库.几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理 ...
- Centos 基本命令不能用恢复方法
遇到命令都不能用,直接执行下面的语句就可以: export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/roo ...
- python中os.path.isdir()等函数的作用和用法
一 用法和概念: Python中的os模块用于和系统进行交互,其中: 1 os.listdir()用于返回一个由文件名和目录名组成的列表,需要注意的是它接收的参数需要是一个绝对的路径. 2 os.pa ...
- AI - 参考消息(References)
01 - Machine learning infographic 图片解读机器学习的基本概念.五大流派与九种常见算法 EN:http://usblogs.pwc.com/emerging-techn ...
- Tomcat添加HTTPS单向认证和双向认证
前言 前一段时间有了解如何配置Tomcat服务为Https单向认证和双向认证,当时也做了一些记录,今天开始写博客,就把以前的记录拿出来整理下,分享给大家.本文没有介绍证书如何生成,会在下一篇博文里介绍 ...
- python之找最后一个人
题目大概是:有10个人围成一圈,从第一个人数,数到3的人出局,问最后一个人是谁? 围成一圈,那就是无限循环,直至最后一个人,我们可以把10个人看做一个列表,每循环一次就把除3为0的数去除,下次再次循环 ...