hdu3400 两重三分
生活随笔
收集整理的這篇文章主要介紹了
hdu3400 两重三分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?題意給你兩個公路 A-B C-D 和三個速度V(ab) V(cd) 和 V(兩條公路之間) 問你從A到D的最短時間是多少.
思路:
? ?一開始暴力了其中的一條邊,每次加0.01,另一條邊用的三分,結果wa掉了,感覺不wa暴力一條邊時間上也夠嗆,后來看了下題解,人家用的是兩重三分,就是三分其中一條邊,當對于最外層的那個三分的某兩個點也就是 mid mmid,我們在三分兩次,取得最優,
確實如此,因為后來想了想,對于整體來說,總函數里面有兩個未知數,無法確定是他的性質,
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
? ? ?題意給你兩個公路 A-B C-D 和三個速度V(ab) V(cd) 和 V(兩條公路之間) 問你從A到D的最短時間是多少.
思路:
? ?一開始暴力了其中的一條邊,每次加0.01,另一條邊用的三分,結果wa掉了,感覺不wa暴力一條邊時間上也夠嗆,后來看了下題解,人家用的是兩重三分,就是三分其中一條邊,當對于最外層的那個三分的某兩個點也就是 mid mmid,我們在三分兩次,取得最優,
確實如此,因為后來想了想,對于整體來說,總函數里面有兩個未知數,無法確定是他的性質,
但是如果我們分開來想,分成兩部分,那么他們就含有凸性(或凹性)了,這樣我們就可以三分在短時間內找到精度滿足條件的解..
#include<stdio.h> #include<math.h>#define eps 0.0001 typedef struct {double x ,y; }NODE;NODE A ,B ,C ,D; double P ,Q ,R;double dis(NODE X ,NODE Y) {double tmp = pow(X.x - Y.x ,2.0) + pow(X.y - Y.y ,2.0);return sqrt(tmp); }double CD_3F(NODE now) {NODE low ,up ,mid ,mmid;double t1 ,t2;low = C ,up = D;while(1){mid.x = (low.x + up.x) / 2;mid.y = (low.y + up.y) / 2;t1 = dis(now ,mid) / R + dis(mid ,D) / Q;mmid.x = (mid.x + up.x) / 2;mmid.y = (mid.y + up.y) / 2;t2 = dis(now ,mmid) / R + dis(mmid ,D) / Q;if(t1 > t2) low = mid;else up = mmid;if(dis(low ,up) < eps) break;}return t2; }double AB_3F() {NODE low ,up ,mid ,mmid;low = A ,up = B;double t1 ,t2;while(1){ //puts("ok"); mid.x = (low.x + up.x) / 2;mid.y = (low.y + up.y) / 2;t1 = dis(A ,mid) / P + CD_3F(mid);mmid.x = (mid.x + up.x) / 2;mmid.y = (mid.y + up.y) / 2;t2 = dis(A ,mmid) / P + CD_3F(mmid);if(t1 > t2) low = mid;else up = mmid;if(dis(low ,up) < eps) break;}return t1; }int main () {int t;scanf("%d" ,&t); while(t--){scanf("%lf %lf %lf %lf" ,&A.x ,&A.y ,&B.x ,&B.y);scanf("%lf %lf %lf %lf" ,&C.x ,&C.y ,&D.x ,&D.y);scanf("%lf %lf %lf" ,&P ,&Q ,&R);printf("%.2lf\n" ,AB_3F());}return 0; }
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的hdu3400 两重三分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu2438 三分
- 下一篇: hdu3714 水三分