国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ICPCCamp2017 Day 4 A The Catcher in the Rye(二分+光的折射定律)

2019-11-08 18:23:11
字體:
來源:轉載
供稿:網友

大體題意:

告訴你有三個矩形連在一起,要求你從第一個矩形左下角出發,到第三個矩形的右上角,在每個矩形中速度不一樣,求最少時間?

思路:

最容易想到的是三分。

取第一個矩形的走的高度是x, 第二個玻璃走的高度是y,列一個函數發現是一個凹函數。

三分就好了。但是時間是0.25s  過不了。

不過有大神 有一個小技巧,就是把這三個矩形 縮小h倍。  最后算完 在乘回去。  (好猛= =)

其實正解是二分。 

把它想成光線, 肯定有一個唯一確定的光線路徑。

利用光的折射定律來二分。

只需要二分枚舉第一個路徑的角度, 就可以算出剩下的兩個來,加起來看是否是高度H即可。

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#define sqr(x) ((x)*(x))using namespace std;const double eps = 1e-10;const double pi = acos(-1.0);int T;double h,a,b,c,va,vb,vc;int mm = 16;double oo = 1e5+10;inline int dcmp(double a,double b){    if (fabs(a-b) < eps) return 0;    if (a < b) return -1;    return 1;}double ha,hb,hc;void go(double m){    double sina = sin(m);    double cosa = sqrt(1-sqr(sina));    double tana = sina/cosa;    ha = tana*a;    double sinb = sina*vb/va;    double cosb = sqrt(1-sqr(sinb));    double tanb = sinb/cosb;    hb = b*tanb;    double sinc = sina*vc/va;    double cosc = sqrt(1-sqr(sinc));    double tanc = sinc/cosc;    hc = c*tanc;}int main(){    scanf("%d",&T);    while(T--){        scanf("%lf %lf %lf %lf %lf %lf %lf",&h, &a, &b, &c, &va, &vb, &vc);        double l = 0, r = pi/2;        while(r-l > eps){            double m = (l+r)/2;            go(m);            if (dcmp(ha+hb+hc,h) < 0) l=m;            else r = m;        }        go((l+r)/2);        PRintf("%.10f/n",sqrt(sqr(ha)+sqr(a))/va + sqrt(sqr(hb)+sqr(b))/vb + sqrt(sqr(hc)+sqr(c))/vc);    }    return 0;}/**210 3 4 3 1 1 121 5 12 4 4 3 4**/


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 讷河市| 石狮市| 云龙县| 社旗县| 威远县| 寿宁县| 大丰市| 夏津县| 奉化市| 黔西县| 密山市| 自治县| 虹口区| 修水县| 兰考县| 伊通| 兴隆县| 奈曼旗| 深州市| 大竹县| 嘉鱼县| 民县| 湟中县| 信阳市| 淮滨县| 连平县| 满城县| 陈巴尔虎旗| 合山市| 神池县| 永丰县| 沁源县| 凉山| 凤山县| 仁化县| 沁阳市| 盘山县| 大同县| 青阳县| 进贤县| 驻马店市|