JZOJ5771 遨遊 二分 DFS

2022-09-03 05:03:10 字數 1675 閱讀 8809

題目:

給出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

]所在城市])×

0.5])×

0.5。

如果要從ss到t

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

r][l

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

l最大的情況下且r

r盡量小的l,r

l,r。

可以二分ll和r

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

l,第二重二分rr。

每次二分完l

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

l的路到達終點,如果可以,就二分rr。

每次二分r

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

l且小於r

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

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

#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

題目 給出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 pe...

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行,每行乙個正整數表...