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权威指南》2-URL
前言 在一个城市中,所有的东西都有一个标准化的名字,以帮助人们寻找城市中的各种资源,如宁波火车站地铁站,在因特网这座大城市中,URL就是其标准化名称,它指向每一条电子信息,告诉你它们位于何处,以及如何 ...
- Xcode中SVN不能提交.a文件的解决方法
我是搬运工!!!方便自己使用!!! 方案一: 在mac下很多svn管理工具默认都不能上传.a文件,这让人很苦恼.从网上扒了下,用命令行可以解决此问题. 打开终端,cd 进入到需要上传的.a文件所在的文 ...
- .net反混淆脱壳工具de4dot的使用
de4dot是一个开源的.net反混淆脱壳工具,是用C#编写的,介绍一下它的使用方法 首先 pushd 到de4dot.exe所在文件夹,然后调用 de4dot.exe 路径+dll名称 如果显示: ...
- Android WebView 超大字号适配问题
目前在使用 Android WebView 展示H5页面的时候,存在当系统字号设置超大的时候,出现页面内容展示不全的问题. 此问题是因为Android WebView 默认使用系统字号进行展示. 解决 ...
- 吴恩达机器学习笔记1-单变量线性回归(Linear Regression with One Variable)
在监督学习中我们有一个数据集,这个数据集被称训练集.
- postgresql 日常sql
查看服务进程: select pid,usename,client_addr,client_port from pg_stat_activity; 查看当前数据库实例的版本: select ve ...
- mybatis foreach报错It was either not specified and/or could not be found for the javaType Type handler
或许是惯性思维,在mybatis使用foreach循环调用的时候,很多时候都是传一个对象,传一个List的情况很少,所以写代码有时候会不注意就用惯性思维方法做了. 今天向sql传参,传了一个List作 ...
- 简介 - PMP(Project Management Professional)
PMP(Project Management Professional) 官网(英文报名):https://www.pmi.org/ 中文注册:http://exam.chinapmp.cn/ Boo ...
- python学习笔记01-变量
变量的作用: 1.保存信息 方便日后被调用 操作 2. 更改 代表描述性的意思 让人明白是什么意思 行业命名规则: 1.student_number 2.studentNumber 驼峰体 不要以大 ...
- 《你不知道的JavaScript(上卷)》读书笔记
第一次尝试用思维导图记笔记,感觉还不错~~~不过还是改不了我读书笔记写成抄书笔记的毛病 =.= 因为开始学JS的时候,一般浏览器就已经支持ES6了,所以比较喜欢使用ES6语法,let,=>等,文 ...