分治 路由器安置問題

2021-09-29 23:18:56 字數 934 閱讀 1592

題設:一條街道安裝無線網路,需要放置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戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。輸入第一...