zoukankan      html  css  js  c++  java
  • hdu 4454 Stealing a Cake 三分法

    很容易想到三分法求解,不过要分别在0-pi,pi-2pi进行三分。

    另外也可以直接暴力枚举……

    代码如下:

      1 #include<iostream>
      2 #include<stdio.h>
      3 #include<algorithm>
      4 #include<iomanip>
      5 #include<cmath>
      6 #include<cstring>
      7 #include<vector>
      8 #define ll __int64
      9 #define pi acos(-1.0)
     10 #define MAX 50000
     11 using namespace std;
     12 struct point
     13 {
     14     double x,y;
     15     point(double _x=0,double _y=0){
     16         x=_x;
     17         y=_y;
     18     }
     19     point operator-(point a){
     20         return point(x-a.x,y-a.y);
     21     }
     22     point operator+(point a){
     23         return point(x+a.x,y+a.y);
     24     }
     25     double operator*(point a){
     26         return (x*a.x+y*a.y);
     27     }
     28 }p1,p2,p;
     29 double x,y,r;
     30 double dis2(point a,point b)
     31 {
     32     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
     33 }
     34 double dis(point a, point b, point c)
     35 {
     36     point ab = b - a;
     37     point ac = c - a;
     38     double f = ab*ac;
     39     if (f<0) return dis2(c, a);//C1处的点
     40     double d = ab*ab;
     41     if ( f>d) return dis2(c, b);//C2处的点,d=f*cos(theta)
     42     f = f/d;
     43     ab.x*=f;ab.y*=f;
     44     point D = a + ab; // c在ab线段上的投影点
     45     return dis2(c, D);
     46 }
     47 double line(point a)
     48 {
     49     point b,c;
     50     b.x=min(p1.x,p2.x);
     51     b.y=max(p1.y,p2.y);
     52     c.x=max(p1.x,p2.x);
     53     c.y=min(p1.y,p2.y);
     54     double MIN1,MIN2;
     55     MIN1=min(dis(p2,c,a),dis(p1,c,a));
     56     MIN2=min(dis(p1,b,a),dis(p2,b,a));
     57     return min(MIN1,MIN2);
     58 }
     59 point get(double a)
     60 {
     61     return point(x+r*cos(a),y+r*sin(a));
     62 }
     63 double solve()
     64 {
     65     double r,l,mid,midmid,t1,t2,ans1,ans2;
     66     point m1,m2;
     67     r=pi;l=0;
     68     while(r-l>=1e-8){
     69         mid=(r+l)/2;
     70         midmid=(mid+r)/2;
     71         m1=get(mid);
     72         m2=get(midmid);
     73         t1=line(m1)+dis2(m1,p);
     74         t2=line(m2)+dis2(m2,p);
     75         if(t1>t2) l=mid;
     76         else r=midmid;
     77     }
     78     ans1=t1;
     79     r=2*pi;l=pi;
     80     while(r-l>=1e-8){
     81         mid=(r+l)/2;
     82         midmid=(mid+r)/2;
     83         m1=get(mid);
     84         m2=get(midmid);
     85         t1=line(m1)+dis2(m1,p);
     86         t2=line(m2)+dis2(m2,p);
     87         if(t1>t2) l=mid;
     88         else r=midmid;
     89     }
     90     ans2=t1;
     91     return min(ans1,ans2);
     92 }
     93 int main(){
     94     while(cin>>p.x>>p.y){
     95         if(fabs(p.x)<1e-8&&fabs(p.y)<1e-8) break;
     96         cin>>x>>y>>r>>p1.x>>p1.y>>p2.x>>p2.y;
     97         point temp;
     98         temp.x=p1.x;temp.y=p1.y;
     99         p1.x=min(p1.x,p2.x);p1.y=min(p1.y,p2.y);
    100         p2.x=max(temp.x,p2.x);p2.y=max(temp.y,p2.y);
    101         printf("%.2lf
    ",solve());
    102     }
    103     return 0;
    104 }
    View Code
  • 相关阅读:
    数据--第53课
    数据--第52课
    数据--第51课
    标准模板库中的优先队列(priority_queue)
    进程的定义
    进程的基本概念
    循环不变式
    插入排序
    模板声明
    标准模板库中的队列(queue)
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3253215.html
Copyright © 2011-2022 走看看