當(dāng)前位置:
首頁(yè) >
hdu3400 两重三分
發(fā)布時(shí)間:2025/6/17
23
豆豆
生活随笔
收集整理的這篇文章主要介紹了
hdu3400 两重三分
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
? ? ?題意給你兩個(gè)公路 A-B C-D 和三個(gè)速度V(ab) V(cd) 和 V(兩條公路之間) 問(wèn)你從A到D的最短時(shí)間是多少.
思路:
? ?一開(kāi)始暴力了其中的一條邊,每次加0.01,另一條邊用的三分,結(jié)果wa掉了,感覺(jué)不wa暴力一條邊時(shí)間上也夠嗆,后來(lái)看了下題解,人家用的是兩重三分,就是三分其中一條邊,當(dāng)對(duì)于最外層的那個(gè)三分的某兩個(gè)點(diǎn)也就是 mid mmid,我們?cè)谌謨纱?取得最優(yōu),
確實(shí)如此,因?yàn)楹髞?lái)想了想,對(duì)于整體來(lái)說(shuō),總函數(shù)里面有兩個(gè)未知數(shù),無(wú)法確定是他的性質(zhì),
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
? ? ?題意給你兩個(gè)公路 A-B C-D 和三個(gè)速度V(ab) V(cd) 和 V(兩條公路之間) 問(wèn)你從A到D的最短時(shí)間是多少.
思路:
? ?一開(kāi)始暴力了其中的一條邊,每次加0.01,另一條邊用的三分,結(jié)果wa掉了,感覺(jué)不wa暴力一條邊時(shí)間上也夠嗆,后來(lái)看了下題解,人家用的是兩重三分,就是三分其中一條邊,當(dāng)對(duì)于最外層的那個(gè)三分的某兩個(gè)點(diǎn)也就是 mid mmid,我們?cè)谌謨纱?取得最優(yōu),
確實(shí)如此,因?yàn)楹髞?lái)想了想,對(duì)于整體來(lái)說(shuō),總函數(shù)里面有兩個(gè)未知數(shù),無(wú)法確定是他的性質(zhì),
但是如果我們分開(kāi)來(lái)想,分成兩部分,那么他們就含有凸性(或凹性)了,這樣我們就可以三分在短時(shí)間內(nèi)找到精度滿足條件的解..
#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; }
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的hdu3400 两重三分的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hdu2438 三分
- 下一篇: hdu3714 水三分