首先看一下題面吧:
【問題描述】
一條街道安裝無線網路,需要放置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...