1. 程式人生 > >【bzoj1857】[Scoi2010]傳送帶

【bzoj1857】[Scoi2010]傳送帶

兩條傳送帶AB和CD,在上面移動速度分別為v1v2,其他地方移動速度為v0,求A到D的最短時間。
雋爺說是三分
於是yy了一節數學課的證明。。。
後來發現尼瑪這不是隨便證麼。。。。

先把兩條傳送簡化成一條線段AB和一個點D,線段上速度為v1,其他為v0
顯然有一個點P使得P在AB上且t=APv1+PDv0為最小值
那麼原命題就轉化成證明APt的函式關係是一個單峰函式。
A(x1,y1),D(x2,y2),P(x0,y0)
題目中所有的點都是在第一象限,再出於簡化考慮,把整個圖旋轉一下,使得AB平行於X軸,這樣就有y0恆不變,t與AP的關係變成t與x0的關係。
可以有t

=x0x1v1+(x2x0)2+(y2y0)2v2
為了方便,先設dis=(x2x0)2+(y2y0)2,顯然dis0
然後把t求個導
t=1v1+(dis)disv2dis
其中dis=[x202x2x0+x22+(y0y2)2]
=2x02x2
那麼t=1v1+2(x0x2)disv2dis
這玩意最多隻有一個零點
所以最開始那玩意就是單峰的了
然後別的情況就從這個最基本的情況擴展出去就好
於是乎在AB,CD上的離開、進入點可以三分搞搞
(以上口胡)
似乎WJMZBMR寫的是退火orz
屬於亂搞。。。?
跪跪跪跪…………
我的程式碼跑的好慢啊TAT

#include <bits/stdc++.h>

typedef double db;

const db eps = 1e-7;

db fsqr(db x) { return x * x ; }

struct point { 
    db x , y;

    point(db x = 0 , db y = 0):x(x) , y(y) { }

    friend point operator+(point a , point b)
        { return point(a.x + b.x , a.y + b.y) ; }

    friend point operator-(point a , point b)
        { return
point(a.x - b.x , a.y - b.y) ; } friend point operator*(point a , db b) { return point(a.x * b , a.y * b) ; } friend point operator/(point a , db b) { return point(a.x / b , a.y / b) ; } friend db dis(point a , point b) { return sqrt(fsqr(a.x - b.x) + fsqr(a.y - b.y)) ; } }A , B , C , D; db v1 , v2 , v0; db find(point D , point A , point B) { point l = A , r = B ; while (dis(l , r) > eps) { point d = (r - l) / 3.0 , m1 = l + d , m2 = r - d; db r1 = dis(m1 , B) / v2 + dis(m1 , D) / v0 , r2 = dis(m2 , B) / v2 + dis(m2 , D) / v0 ; if (r1 < r2) r = m2 ; else l = m1; } return dis(l , B) / v2 + dis(l , D) / v0 ; } int main() { 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" , &v1 , &v2 , &v0); point l = A , r = B; while (dis(l , r) > eps) { point d = (r - l) / 3.0 , m1 = l + d , m2 = r - d; db t1 = dis(m1 , A) / v1 , t2 = dis(m2 , A) / v1; db r1 = find(m1 , C , D) , r2 = find(m2 , C , D); r1 += t1 , r2 += t2 ; if (r1 < r2) r = m2 ; else l = m1 ; } printf("%.2lf\n" , find(l , C , D) + dis(l , A) / v1); return 0; }

相關推薦

bzoj1857[Scoi2010]傳送帶

兩條傳送帶AB和CD,在上面移動速度分別為v1和v2,其他地方移動速度為v0,求A到D的最短時間。 雋爺說是三分 於是yy了一節數學課的證明。。。 後來發現尼瑪這不是隨便證麼。。。。 先把兩條傳

bzoj1857傳送帶——三分套三分

div get 最優解 ring cal () spl 分享 cst 我的第一道三分題目。 早上跟著cyc學了一下三分,晚上想練一下手發現沒什麽水題就找到了這一道2333 主要是證明是一個單峰函數,這也是本題最難的部分(網上好多人寫出來但不會證明:)) 證明過程來自yyl

bzoj1853[Scoi2010]幸運數字 容斥原理+搜索

輸出 ble std pre urn 數據 統計 號碼 容斥 題目描述 在中國,很多人都把6和8視為是幸運數字!lxhgww也這樣認為,於是他定義自己的“幸運號碼”是十進制表示中只包含數字6和8的那些號碼,比如68,666,888都是“

bzoj1855 [Scoi2010]股票交易

推出 不一定 begin aligned all IT fine space for 上一篇blog已經講了單調隊列與單調棧的用法,本篇將講述如何借助單調隊列優化dp。 我先丟一道題:bzoj1855 此題不難想出O(n^4)做法,我們用f[i][j]表示第i天手

BZOJ[Scoi2010] 股票交易

1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 7 #de

javaMailjava傳送帶附件郵件

package com.example.mail; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.Da

解題報告洛谷 P2571 [SCOI2010]傳送帶

【解題報告】洛谷 P2571 [SCOI2010]傳送帶今天無聊,很久沒有做過題目了,但是又不想做什麼太難的題目,所以就用洛谷隨機跳題,跳到了一道題目,感覺好像不是太難。 [CSDN連結](https://blog.csdn.net/Liang_Si_FFF/article/details/84570359

SCOI2010JZOJ4692傳送帶

Description 在一個2維平面上有兩條傳送帶,每一條傳送帶可以看成是一條線段。兩條傳送帶分別為線段AB和線段CD。FTD在AB上的移動速度為P,在CD上的移動速度為Q,在平面上的移動速度R。現在FTD想從A點走到D點,他想知道最少需要走多長時間。

BZOJ 1857: [Scoi2010]傳送帶三分

膜一波PhDPhDPhD大佬啊~~ 三分兩個傳送帶的距離,然後相似算一下座標: #include <cmath> #include <cstdio> #include <cstring> #include <iostr

洛谷P1641[SCOI2010]生成字符串

個數 ati es2017 name span thml www 生成 n) 題目描述 lxhgww最近接到了一個生成字符串的任務,任務需要他把n個1和m個0組成字符串,但是任務還要求在組成的字符串中,在任意的前k個字符中,1的個數不能少於0的個數。現在lxhgww想要知道

線段樹P2572SCOI2010序列操作

Description lxhgww最近收到了一個01序列,序列裡面包含了n個數,這些數要麼是0,要麼是1,現在對於這個序列有五種變換操作和詢問操作: 0 a b 把[a, b]區間內的所有數全變成0 1 a b 把[a, b]區間內的所有數全變成1 2 a b 把[a,b]區間內的所有數全部取反,也

三分--bzoj1857: [Scoi2010]傳送帶

傳送門 三分套三分 證明很噁心。。大概就是確定了在ab上走多長 就可以列出一個關於在cd上走的路程關於時間的函式式,然後這個函式是單峰的 相似的,在ab上走的路程關於時間的函式也是單峰的 所以

Python傳送帶文字圖片附件的郵件

#coding: utf-8 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.image import MIMEImage H

解疑PostMan 使用Interceptor 傳送帶cookie的請求一直loading

問題 最近要寫一個爬蟲(雖然是第一次寫),於是就用了Chrome上非常方便一個外掛,PostMan,但是由於chrome安全的限制,發不出帶cookie和帶有自定義頭部標籤的請求。 百度一番後得如果想要傳送帶cookie的請求,就需要開啟Interce

Bzoj1857:[Scoi2010]傳送帶:三分

首先由猜測法證得函式具有下凸性QwQ 然後就可以三分辣 #include<cmath> #include<cstdio> #include<cstdlib> #i

bzoj 1854[Scoi2010]遊戲 二分圖匹配

http://blog.csdn.net/pbihao/article/details/52835849 額,感覺像是一道題改一下就好了 #include<cstdio> #inclu

[bzoj1854][Scoi2010]遊戲並查集貪心

【題目描述】Descriptionlxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每種裝備最多隻能使用一次。 遊戲進行到最後,lxhgww遇到

洛谷1640[SCOI2010]連續攻擊遊戲

題目描述 lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某一個屬性。並且每種裝備最多隻能使用一次。遊戲進行到最後,lxhgww遇到了終極bo

bzoj1857: [Scoi2010]傳送帶

看到這題第一感覺暴力呀233 然後就亂搞水過了(資料太水?) 我的做法是將AB,CD分別等分為512段 這樣AB,CD上各有513個頂點,不妨設AB上的頂點為E,CD上的頂點為F 通過數學容易得到A到D的最短時間移動路徑是AE-EF-FD, 那列舉E在AB上那513個頂點位

[BZOJ1857][Scoi2010]傳送帶(三分套三分+計算幾何)

題目描述 傳送門 題解 感覺一下好像在傳送帶上走的太多或者走得太少時間都不是最優的 實際上答案對走的長短單峰 然後就三分套三分… 注意: ①find中的ans一定要有初始值,防止根本不