Aquarium Tank(csu1634+幾何+二分)Contest2087,csu1634contest2087

來源:互聯網
上載者:User

Aquarium Tank(csu1634+幾何+二分)Contest2087,csu1634contest2087

 Aquarium TankTime 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
430 5020 0100 0100 4020 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=0,double y=0):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-8; int dcmp(double x){    if(fabs(x)<eps)return 0;    else return x < 0 ? -1 : 1;}bool operator == (const Point& a,const Point& b){    return dcmp(a.x-b.x)==0 && dcmp(a.y-b.y)==0;} 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=0;    for(int i=0; i<n; i++)    {        area+=Cross(p[i],p[(i+1)%n]);    }    return fabs(area/2);} 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[105],Q[105];    int T,n,q,i;    while(scanf("%d",&n)!=EOF)    {        scanf("%lf%lf",&D,&L);        hmax=0;        for(i=0; i<n; i++)        {            read_point(po[i]);        }        double d=0,h=hmax;        while(h-d>eps)        {            q=0;            int per=n-1;            double m=(d+h)/2;            Point M(0,m);            Vector w(1,0);            for(int i=0; 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*1000-area*D>eps) d=m;            else h=m;        }        printf("%.2f\n",d);    }    return 0;} /**************************************************************    Problem: 1634    User: aking2015    Language: C++    Result: Accepted    Time:0 ms    Memory:1500 kb****************************************************************/


 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.