路由器安置(routing)Solution

2021-07-28 08:17:21 字數 2184 閱讀 5433

首先看一下題面吧:

【問題描述】

一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。

【輸入資料】

輸入檔案第一行包含兩個整數m和n,以下n行每行乙個整數hi表示該戶居民在街道上相對於某個點的座標。

【輸出資料】

輸出檔案僅包含乙個數,表示最小的覆蓋半徑,保留一位小數。

【樣例輸入】

2 310

【樣例輸出】

1.0   (在2,10位置上各放乙個)

【資料規模】

對於60%的資料,有1 ≤ n, m ≤ 100,-1000 ≤ hi ≤ 1000;

對於100%的資料,有1 ≤ n, m ≤ 100000,-10000000 ≤ hi ≤ 10000000。

嗯看到這個題是很懵的;

一開始想到的是.....貪心?

但是具體怎麼搞就很迷了;

還好考試的時候告訴了我們這是分治專題,辣麼我們就考慮分治咯_(:зゝ∠)_

我們可以這麼搞:

假設我們已經知道了半徑,然後二分找是不是可以有比它更小的對吧;

每次找乙個半徑,如果在規定的路由器數目以內能夠覆蓋所有的點,就合法,然後繼續往左走,找更小的半徑;

如果不合法,就往右找,於是最後我們就能保證得到的是最小的半徑了;

(查之前先排序的)

int l=1,r=h[n]-h[1]+1;//這裡的r是右端點不是半徑qwq

while(l>1;

if(cover(mid))r=mid;

else l=mid+1;

}

其中cover是判斷是否合法的函式;

那麼現在我們來討論一下怎麼搞這個函式;

首先,我們假設我們的資料已經用了很高效的排序方法排過了序,

然後到原點的距離就一一出來啦;

所以我們從最小的那個點開始,設為h[1];

然後我們在h[1]+r的地方放乙個路由器;

看有多少個路由器在它的覆蓋範圍內;

然後把第乙個沒有被覆蓋的路由器按照h[1]的方法處理,路由器個數累加;

如果在個數<=m的情況下覆蓋了,我們就return 1;

否則return 0;

具體到操作就是找第乙個大於h[i]+2*r的位置;

但是,對於hi的最大總距離2*10^7,加上上面的排序以及乙個logn的查詢,如果我們還有乙個n的判斷,那麼我們應該是炸了吧;

所以我們的判斷也要用二分咯;

什麼你告訴我你不想打了_(:зゝ∠)_

猴我們順便看乙個神奇的東西

upper_bound(forwarditerator first, forwarditerator last, const t& val);
這是乙個厲害的庫函式;

指向[first , last)中第乙個》val的元素;

這是不是剛好符合我們的要求;

我們來看看它的原型函式:

templateinline _forwarditerator

upper_bound(_forwarditerator __first, _forwarditerator __last,

const _tp& __val, _compare __comp)

嗯你們記住它差不多用的就是二分就行了;

於是吧,這個cover函式就出來了

bool cover(int d)

return 1;

}

然後這道題就a掉了w

下面貼整個**吧:

#include#include#define maxn 100001

using namespace std;

int h[maxn],m,n;

template template inline int read(t&n)

bool cover(int d)

return 1;

}main()

printf("%.1lf",(double)l/2.0);//二分的是半徑,所以除以2

return 0;

}

路由器安置 Routing

一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。1 n,m 100000 首先這種問題可以採用二分答案的方法.嘗試...

upc 路由器安置

時間限制 1 sec 記憶體限制 128 mb 題目描述 一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。輸入第一...

分治 路由器安置問題

題設 一條街道安裝無線網路,需要放置m個路由器。整條街道上一共有n戶居民,分布在一條直線上,每一戶居民必須被至少一台路由器覆蓋到。現在的問題是所有路由器的覆蓋半徑是一樣的,我們希望用覆蓋半徑盡可能小的路由器來完成任務,因為這樣可以節省成本。cover函式檢測該直徑是否足夠覆蓋該位址 upper bo...