Hdu 2289  à Cup

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289

题意: 给你一个杯子(圆台状的),告诉你下底半径、上底半径、高度和里面装的水的体积,然后问你水的高度。

算法:二分

思路:对水的高度进行二分,根据比例求水的体积,与题目给定的体积进行比较。

 

Hdu 3400  à Line belt

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3400

题意:给你两条线ab和cd,告诉你这四个点的坐标,然后ab上的移动速度为p,cd上的移动速度是q,两条线之外的地方移动速度为r,然后问你从a到d最短时间需要多少?

算法:三分

思路:假设在ab线上移动的距离x,在cd线上的移动距离y,然后时间就等于 x/p + y/q + 两点间距离/r ,做法用三分找x,然后将x和找到的点传递下去三分找y,期间两次都是找极小值。

 

  1 #include<stdio.h>
  2 #include<conio.h>
  3 #include<math.h>
  4 #define EPS 0.00000001
  5 typedef struct node
  6 {
  7   double x,y;
  8 }Node;
  9 double lab,lcd;
 10 Node funa(Node a,Node b,double x)  // a -> b
 11 {
 12   Node tmp;
 13   if(lab==0)
 14   {
 15     return a;
 16   }
 17   double sab=(b.y-a.y)/lab;
 18   double cab=(b.x-a.x)/lab;
 19   tmp.y=x*sab+a.y;
 20   tmp.x=x*cab+a.x;
 21   return tmp;
 22 }
 23 Node fund(Node c,Node d,double x)  // d -> c
 24 {
 25   Node tmp;
 26   if(lcd==0)
 27   {
 28     return c;
 29   }
 30   double scd=(c.y-d.y)/lcd;
 31   double ccd=(c.x-d.x)/lcd;
 32   tmp.y=d.y+x*scd;
 33   tmp.x=d.x+x*ccd;
 34   return tmp;
 35 }
 36 double funab(Node a,Node b)
 37 {
 38   return sqrt((b.y-a.y)*(b.y-a.y)+(b.x-a.x)*(b.x-a.x));
 39 }
 40 int t,p,q,w;
 41 double solve(Node A,Node B,double i,double j)
 42 {
 43   double ans=funab(A,B)/w;
 44   ans+=i/p;
 45   ans+=j/q;
 46   return ans;
 47 }
 48 Node a,b,c,d;
 49 double fun(Node A,double x,double y)
 50 {
 51   Node B=fund(c,d,y);
 52   return solve(A,B,x,y);
 53 }
 54 double san(Node A,double x,double l,double r)
 55 {
 56   double mid,mmid;
 57   double fm,fmm;
 58   while(l+EPS<r)
 59   {
 60     mid=(l+r)/2;
 61     mmid=(r+mid)/2;
 62     fm=fun(A,x,mid);
 63     fmm=fun(A,x,mmid);
 64     // 以求极小值为例
 65     if(fm>=fmm) l=mid;
 66     else r=mmid;
 67   }
 68   fm=fun(A,x,l);
 69   return fm;
 70 }
 71 double f(double x)
 72 {
 73   Node A=funa(a,b,x);
 74   return san(A,x,0,lcd);
 75 }
 76 double san_f(double l,double r)
 77 {
 78   double mid,mmid;
 79   double fm,fmm;
 80   while(l+EPS<r)
 81   {
 82     mid=(l+r)/2;
 83     mmid=(r+mid)/2;
 84     fm=f(mid);
 85     fmm=f(mmid);
 86     // 以求极小值为例
 87     if(fm>=fmm) l=mid;
 88     else r=mmid;
 89   }
 90   fm=f(l);
 91   return fm;
 92 }
 93 int main()
 94 {
 95   scanf("%d",&t);
 96   while(t--)
 97   {
 98     scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
 99     scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
100     scanf("%d%d%d",&p,&q,&w);
101     lab=funab(a,b);
102     lcd=funab(c,d);
103     double mt=san_f(0,lab);
104     printf("%.2lf\n",mt);
105   }
106   return 0;
107 }
AC代码

相关文章:

  • 2022-01-31
  • 2021-05-01
  • 2022-12-23
  • 2021-05-19
  • 2021-04-24
  • 2021-11-13
  • 2021-10-12
  • 2021-07-30
猜你喜欢
  • 2022-12-23
  • 2022-02-26
  • 2021-11-28
  • 2021-08-07
  • 2021-11-12
  • 2021-08-14
  • 2022-12-23
相关资源
相似解决方案