JZOJ5771 遨遊 二分 DFS

2021-08-28 08:30:02 字數 1856 閱讀 4179

題目:

給出n

nn個省,每個神有自己的折扣per

[i

]per[i]

per[i]

,每個省有num

[i

]num[i]

num[i]

個城市。有m

mm條路,每條路連線兩個城市u[i

]u[i]

u[i]

和v [i

]v[i]

v[i]

,原價是w[i

]w[i]

w[i]

,但打折後的**就是(pe

r[u[

i]

(per[u[i]

(per[u

[i]所在城市]+p

er[v

[i

]]+per[v[i]

]+per[

v[i]

所在城市])×

0.5])\times 0.5

])×0.5

。如果要從s

ss到t

tt的路程免費,那麼就得有打折後**在[l,

r]

[l,r]

[l,r

]區間之間的路免費通行。求在l

ll最大的情況下且r

rr盡量小的l,r

l,rl,

r。可以二分l

ll和rrr。

二分巢狀二分,第一重二分l

ll,第二重二分rrr。

每次二分完l

ll之後,搜尋一遍能否只走**大於l

ll的路到達終點,如果可以,就二分rrr。

每次二分r

rr之後,如果搜到可以只走**大於l

ll且小於r

rr的路線的話,那麼久將這一組答案記錄下來。

最終輸出記錄的答案即可。

#include

#include

#include

#define n 101000

using

namespace std;

int n,m,num,s,t,l1,r1,l2,r2,mid1,mid2,tot,l,r;

int u[n]

,v[n]

,pos[n]

,head[n]

;double w[n]

,per[n]

;bool ok,vis[n]

;struct edge

e[n*2]

;void

add(

int from,

int to,

double dis)

bool

dfs(

int x,

int l,

int r)

//搜尋是否有方法可以在限制條件下到達t

intmain()

}for

(int i=

1;i<=n;i++

)scanf

("%lf"

,&per[i]);

for(

int i=

1;i<=m;i++

)scanf

("%d%d"

,&s,

&t);

l1=0;

r1=15000

;while

(l1<=r1)

//二分l

else l2=mid2+1;

}if(ok) l1=mid1+1;

else r1=mid1-1;

}printf

("%d %d\n"

,l,r)

;return0;

}

JZOJ5771 遨遊 二分 DFS

題目 給出nn 個省,每個神有自己的折扣per i p er i 每個省有num i n um i 個城市。有m m條路,每條路連線兩個城市u i u i 和v i v i 原價是w i w i 但打折後的 就是 pe r u i p er u i 所在城市 p er v i per v i 所在城...

JZOJ 二分 抄書

與書的複製差不多 洛谷 書的複製 但是只要輸出最大的時間 樣例輸入9 3 100 200 300 400 500 600 700 800 900樣例輸出1700樣例解釋1 1500 100 200 300 400 500 2 1300 600 700 3 1700 800 900 1300 1500...

dfs 二分,雙向dfs

達達幫翰翰給女生送禮物,翰翰一共準備了n個禮物,其中第i個禮物的重量是g i 達達的力氣很大,他一次可以搬動重量之和不超過w的任意多個物品。達達希望一次搬掉盡量重的一些物品,請你告訴達達在他的力氣範圍內一次效能搬動的最大重量是多少。輸入格式 第一行兩個整數,分別代表w和n。以後n行,每行乙個正整數表...