日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【HDU 3400】Line belt(三分法)

發布時間:2024/4/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【HDU 3400】Line belt(三分法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

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

題意

有兩條傳送帶AB和CD,移動速度分別為p,q。
除了傳送帶的其他區域移動速度為r,問A到D最短時間。

題目分析

  • 在AB上找一點E,在CD上找一點F。
  • 使得A->E->F->D時間最短。
  • 數學思路

    時間 time = |AE|/p + |EF|/r + |FD|/q。 (|AE|為線段AE的長度。)

    未知量有E的位置和F的位置,由于確定在AB和CD上,所以只需要兩個未知量|AE|和|FD|。

    一般采用拉格朗日乘數法,可以求出最值。

    但是用這個方法解題貌似不太方便,所以有了下面的三分法。

    解題思路

  • 對AB三分,mid1和mid2為分點。
  • 固定mid1對CD進行三分,固定mid2對CD進行三分。
  • mid1得到時間t1,mid2得到時間t2.
  • 不斷三分直到兩次求得時間之差abs(t1-t2)達到一定精度。
  • 三分法

    三分法是求某個區間內的極值點的算法。

    二、三分法詳解

    Code(G++)

    #include <bits\stdc++.h>using namespace std; typedef long long ll; double eps = 1e-6;int p, q, r; int ax, ay, bx, by, cx, cy, dx, dy;double min(double x, double y) {return x < y ? x : y; }double findCD(double ABx, double ABy) {double lx = cx;double ly = cy;double rx = dx;double ry = dy;double mid1x, mid1y, mid2x, mid2y;double time1 = 0, time2 = 0;do {mid1x = lx + (rx - lx) / 3;mid1y = ly + (ry - ly) / 3;mid2x = lx + 2 * (rx - lx) / 3;mid2y = ly + 2 * (ry - ly) / 3;time1 = sqrt((dx - mid1x) * (dx - mid1x) + (dy - mid1y) * (dy - mid1y)) / q +sqrt((ABx - mid1x) * (ABx - mid1x) + (ABy - mid1y) * (ABy - mid1y)) / r;time2 = sqrt((dx - mid2x) * (dx - mid2x) + (dy - mid2y) * (dy - mid2y)) / q +sqrt((ABx - mid2x) * (ABx - mid2x) + (ABy - mid2y) * (ABy - mid2y)) / r;if (time1 < time2) {rx = mid2x;ry = mid2y;} else {lx = mid1x;ly = mid1y;}} while (abs(time1 - time2) > eps);return time1; }//三分AB double findAB() {double lx = ax;double ly = ay;double rx = bx;double ry = by;double mid1x, mid1y, mid2x, mid2y;double time1 = 0, time2 = 0;do {mid1x = lx + (rx - lx) / 3;mid1y = ly + (ry - ly) / 3;mid2x = lx + 2 * (rx - lx) / 3;mid2y = ly + 2 * (ry - ly) / 3;//三分CDtime1 = sqrt((ax - mid1x) * (ax - mid1x) + (ay - mid1y) * (ay - mid1y)) / p + findCD(mid1x, mid1y);time2 = sqrt((ax - mid2x) * (ax - mid2x) + (ay - mid2y) * (ay - mid2y)) / p + findCD(mid2x, mid2y);if (time1 < time2) {rx = mid2x;ry = mid2y;} else {lx = mid1x;ly = mid1y;}} while (abs(time1 - time2) > eps);return time1; }int main() {int t;cin >> t;while (t--) {cin >> ax >> ay >> bx >> by >> cx >> cy >> dx >> dy;cin >> p >> q >> r;printf("%.2lf\n", findAB());}return 0; }

    總結

    以上是生活随笔為你收集整理的【HDU 3400】Line belt(三分法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。