【HDU 3400】Line belt(三分法)
生活随笔
收集整理的這篇文章主要介紹了
【HDU 3400】Line belt(三分法)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=3400
題意
有兩條傳送帶AB和CD,移動速度分別為p,q。
除了傳送帶的其他區域移動速度為r,問A到D最短時間。
題目分析
數學思路
時間 time = |AE|/p + |EF|/r + |FD|/q。 (|AE|為線段AE的長度。)
未知量有E的位置和F的位置,由于確定在AB和CD上,所以只需要兩個未知量|AE|和|FD|。
一般采用拉格朗日乘數法,可以求出最值。
但是用這個方法解題貌似不太方便,所以有了下面的三分法。
解題思路
三分法
三分法是求某個區間內的極值點的算法。
二、三分法詳解
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(三分法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【hdu 1061】Rightmost
- 下一篇: 【HDU 1276】士兵队列训练问题(两