時間限制:
3000 ms | 記憶體限制:65535 kb
難度: 4
描述有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n(n<=10000)個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。
輸入第一行輸入乙個正整數n表示共有n次測試資料。
每一組測試資料的第一行有三個整數n,w,h,n表示共有n個噴水裝置,w表示草坪的橫向長度,h表示草坪的縱向長度。
隨後的n行,都有兩個整數xi和ri,xi表示第i個噴水裝置的的橫座標(最左邊為0),ri表示該噴水裝置能覆蓋的圓的半徑。
輸出每組測試資料輸出乙個正整數,表示共需要多少個噴水裝置,每個輸出單獨佔一行。
如果不存在一種能夠把整個草坪濕潤的方案,請輸出0。
樣例輸入
228樣例輸出6114
52106
4565
1題解:題目分析:本題可以看作是區間覆蓋問題,將每個圓的噴射範圍對映到區間內。可轉換為:如圖,數軸上有n個區間[a-x,a+x](如圖),選擇盡量少的區間覆蓋[0,w]。2
貪心策略
把各區間按照起點從小到大排序,從前向後遍歷,然後每次選擇從當前位置起點開始的最長區間,並以這個區間的最右端為新的起點,繼續選擇,直到找不到區間覆蓋當前位置起點或者當前位置起點已經到達線段末端。
#include #includeposted @#include
#include
#include
#include
using
namespace
std;
const
int maxn = 10000 + 20
;double distance(double ri, double
h);void
solve();
struct
water
} wats[maxn];
bool cmp(const water& a, const water&b)
double distance(double ri, double
h)void
solve()
//排序的範圍是 cnt !!!!!! 不是 n 了!!阿西吧,好氣哦
sort(wats, wats +cnt, cmp);
double current_sum = 0
;
int flag = 1
;
while (current_sum
}if(max)
else
}if (!flag)
else
}}int
main()
2018-02-02 17:17
douzujun 閱讀(
...)
編輯收藏
NYOJ 12 噴水裝置(2)貪心之區間覆蓋問題
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...
貪心演算法訓練 六 噴水裝置 區間覆蓋問題
1.問題描述 長 l 公尺,寬 w 公尺的草坪裡裝有 n 個澆灌噴頭,每個噴頭都裝在草坪的中心線上 離兩邊各 w 2 公尺 我們知道每個噴頭的位置 離草坪中心線左端的距離 以及它能覆蓋到的澆灌範圍。請問如果要同時澆灌整塊草坪,最少需要開啟多少個噴頭?2.輸入格式 輸入包含若干測試資料 每組資料的第一...
貪心 區間覆蓋問題
區間覆蓋問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給...