zoukankan      html  css  js  c++  java
  • [SCOI2010]传送带

    嘟嘟嘟

    首先令E点表示在E点离开传送带AB,F点表示在F点上传送带CD,则总用时为:dis(A, E) / p + dis(E, F) / r + dis(F, D) / q。然而这是一个有两个变量的函数。于是有一个不错的方法:把E成参数,然后就变成了一个形如f(x) = √(t2 + x2)  - x的函数,虽然我证不出来是一个单峰函数,但是几何画板告诉我是。于是我们可以三分求F。至于E,再三分求。

    所以说,这是一道二维的三分套三分的题,三分求E,假设E已知的情况下三分求F。

    代码很好懂。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<cctype>
     8 #include<vector>
     9 #include<stack>
    10 #include<queue>
    11 using namespace std;
    12 #define enter puts("") 
    13 #define space putchar(' ')
    14 #define Mem(a, x) memset(a, x, sizeof(a))
    15 #define rg register
    16 typedef long long ll;
    17 typedef double db;
    18 const int INF = 0x3f3f3f3f;
    19 const db eps = 1e-8;
    20 //const int maxn = ;
    21 inline ll read()
    22 {
    23   ll ans = 0;
    24   char ch = getchar(), last = ' ';
    25   while(!isdigit(ch)) {last = ch; ch = getchar();}
    26   while(isdigit(ch)) {ans = ans * 10 + ch - '0'; ch = getchar();}
    27   if(last == '-') ans = -ans;
    28   return ans;
    29 }
    30 inline void write(ll x)
    31 {
    32   if(x < 0) x = -x, putchar('-');
    33   if(x >= 10) write(x / 10);
    34   putchar(x % 10 + '0');
    35 }
    36 
    37 int ax, ay, bx, by, cx, cy, dx, dy;
    38 int p, q, r;
    39 
    40 db dis(db lx, db ly, db rx, db ry)
    41 {
    42   return sqrt((rx - lx) * (rx - lx) + (ry - ly) * (ry - ly));
    43 }
    44 
    45 db calcF(db Ex, db Ey)
    46 {
    47   db Lx = cx, Ly = cy, Rx = dx, Ry = dy;
    48   while(dis(Lx, Ly, Rx, Ry) > eps)
    49     {    
    50       db Dx = (Rx - Lx) / 3.00, Dy = (Ry - Ly) / 3.00;      
    51       db m1x = Lx + Dx, m2x = Rx - Dx;
    52       db m1y = Ly + Dy, m2y = Ry - Dy;
    53       db ans1 = dis(Ex, Ey, m1x, m1y) / r + dis(m1x, m1y, dx, dy) / q;
    54       db ans2 = dis(Ex, Ey, m2x, m2y) / r + dis(m2x, m2y, dx, dy) / q;
    55       if(ans1 < ans2 + eps) Rx = m2x, Ry = m2y;
    56       else Lx = m1x, Ly = m1y;   
    57     }
    58   return dis(Ex, Ey, Lx, Ly) / r + dis(Lx, Ly, dx, dy) / q;
    59 }
    60 db calcE()
    61 {
    62   db Lx = ax, Ly = ay, Rx = bx, Ry = by;
    63   while(dis(Lx, Ly, Rx, Ry) > eps)
    64     {
    65       db Dx = (Rx - Lx) / 3.00, Dy = (Ry - Ly) / 3.00;
    66       db m1x = Lx + Dx, m2x = Rx - Dx;
    67       db m1y = Ly + Dy, m2y = Ry - Dy;
    68       db ans1 = calcF(m1x, m1y) + dis(ax, ay, m1x, m1y) / p;
    69       db ans2 = calcF(m2x, m2y) + dis(ax, ay, m2x, m2y) / p;
    70       if(ans1 < ans2 + eps) Rx = m2x, Ry = m2y;
    71       else Lx = m1x, Ly = m1y;
    72     }
    73   return calcF(Lx, Ly) + dis(ax, ay, Lx, Ly) / p;
    74 }
    75 
    76 int main()
    77 {
    78   ax = read(), ay = read(); bx = read(), by = read();
    79   cx = read(), cy = read(), dx = read(), dy = read();
    80   p = read(), q = read(), r = read();
    81   printf("%.2lf
    ", calcE());
    82   return 0;
    83 }
    View Code
  • 相关阅读:
    【小模块】公告滚动并暂停
    w3school的PHP教程提炼(一)PHP基础
    Nicholas C. Zakas:介紹CSS Lint(检测工具)
    【小模块】回到顶部的页面跟随按钮(仿淘宝)
    【小模块】内容循环滚动(仿新浪微博未登录首页滚动微博显示)
    前端管窥:图片Sprite管理
    《锋利的jQuery》要点归纳(六)插件的使用和写法
    CSS reset 一份很全的样式表
    《锋利的jQuery》要点归纳(五)jQuery与ajax的应用(上)
    《锋利的jQuery》要点归纳(五)jQuery与ajax的应用(下)
  • 原文地址:https://www.cnblogs.com/mrclr/p/9811212.html
Copyright © 2011-2022 走看看