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的更多相关文章

  1. Contest2071 - 湖南多校对抗赛(2015.03.28)

    Contest2071 - 湖南多校对抗赛(2015.03.28) 本次比赛试题由湖南大学ACM校队原创 http://acm.csu.edu.cn/OnlineJudge/contest.php?c ...

  2. Contest2073 - 湖南多校对抗赛(2015.04.06)

    Contest2073 - 湖南多校对抗赛(2015.04.06) Problem A: (More) Multiplication Time Limit: 1 Sec  Memory Limit:  ...

  3. 湖南多校对抗赛(2015.05.03)Problem A: Twenty-four point

    给四个数 问能不能算出24点...我的方法比较烂...920ms 差点TLE.应该有更好的方法. #include<stdio.h> #include<string.h> #i ...

  4. 湖南多校对抗赛(2015.05.03)Problem B: War

    并查集.从后往前加边. #include<stdio.h> #include<string.h> #include<math.h> #include<algo ...

  5. Contest2089 - 湖南多校对抗赛(2015.05.31) Swipe(csu1648)

    Problem E: Swipe Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 100  Solved: 15[Submit][Status][Web ...

  6. 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 ...

  7. Clock Pictures(kmp + Contest2075 - 湖南多校对抗赛(2015.04.26))

    Problem H: Clock Pictures Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 18[Submit][Stat ...

  8. CSU 2136 ——湖南多校对抗赛 I

    2136: 统帅三军! Submit Page   Summary   Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 55     ...

  9. hdu6097[二分+解析几何] 2017多校6

    /*hdu6097[二分+解析几何] 2017多校6*/ #include <bits/stdc++.h> using namespace std; ; struct node{ doub ...

随机推荐

  1. 使用Spring+MySql实现读写分离(三)主从复制

    mysql  主(master)    从(slave)    复制的原理: 1. master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫 ...

  2. MFC之几类消息的区别

    1.ON_COMMAND与ON_UPDATE_COMMAND_UI 开发MFC程序,给菜单子项添加消息处理函数时,会碰到ON_COMMAND和ON_UPDATE_COMMAND_UI两个消息. ON_ ...

  3. js前段开发工具

    http://runjs.cn/?token=e87dac453af5caed08d1771682b0c3f5

  4. {黑掉这个盒子} \\ FluxCapacitor Write-Up

    源标题:{Hack the Box} \ FluxCapacitor Write-Up 标签(空格分隔): CTF   好孩子们.今天我们将学习耐心和情绪管理的优点.并且也许有一些关于绕过WEB应用防 ...

  5. Idea环境下git 图形化操作

    大家好,之前我们介绍了<IDEA环境下GIT操作浅析之一Idea下仓库初始化与文件提交涉及到的基本命令>和<IDEA环境下GIT操作浅析之二-idea下分支操作相关命令>,本文 ...

  6. itemKNN发展史----推荐系统的三篇重要的论文解读

    itemKNN发展史----推荐系统的三篇重要的论文解读 本文用到的符号标识 1.Item-based CF 基本过程: 计算相似度矩阵 Cosine相似度 皮尔逊相似系数 参数聚合进行推荐 根据用户 ...

  7. java中this的N种使用方法

    this可能是几乎所有有一点面向对象思想的语言都会引用到的变量,java自然不例外.只是,this有多少种用法,我也不知道了,让我们来see see. 由简入奢! 易. 来个例子说明下: public ...

  8. 315道python面试题(参考答案)

    第一部分 Python基础篇 1:为什么学习Python 家里有在这个IT圈子里面,也想让我接触这个圈子,然后给我建议学的Python, 然后自己通过百度和向有学过Python的同学了解了Python ...

  9. Source Qualifter组件中sqlquery过长导致截取

    问题:Source Qualifter组件中sqlquery过长导致截取原因:Source Qualifter组件中sqlquery可以接受的最长字符数是32767个字符,超过这个数字会导致截取解决方 ...

  10. Go语言之Interface(二)

    使用指针接收器和值接收器实现接口 type Describer interface { Describe() } type Person struct { name string age int } ...