題設:一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。
cover函式檢測該直徑是否足夠覆蓋該位址
upper_bound(h+1,h+n+1,h[temp]+d)-h;是二分函式;給出陣列範圍內第乙個》=value的值的位址,只能用於排好序的陣列;
求最小半徑值先訂乙個範圍路由器的半徑為0~(h[n]-h[1])/m,在這個範圍中用二分法尋找半徑值;每得到到乙個二分值就檢測該值是否能覆蓋到全部居民;
檢測方法:在h[1]+r處建立乙個路由器,然後找到第乙個大於h[1]+d的居民位址,安置路由器,迴圈;當路由器數量足夠時說明該半徑足夠大;
#include
#include
#include
#include
#include
#include
#define maxn 100010
using
namespace std;
int h[maxn]
,n,m;
int m,n;
intcover
(int d)
;int
main()
sort
(h+1
,h+n+1)
;int low=
0,high=
(h[n]
-h[1])
/m;while
(lowprintf
("%.1lf",(
double
)low/
2.0);}
intcover
(int d)
return1;
}
路由器安置 Routing
一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。1 n,m 100000 首先這種問題可以採用二分答案的方法.嘗試...
路由器安置(routing)Solution
首先看一下題面吧 問題描述 一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。輸入資料 輸入檔案第一行包含兩個整數m...
upc 路由器安置
時間限制 1 sec 記憶體限制 128 mb 題目描述 一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。輸入第一...