題目:
給出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行,每行乙個正整數表...