貪心演算法之噴水裝置問題

2021-09-14 01:39:07 字數 1369 閱讀 6029

description

長 l 公尺,寬 w 公尺的草坪裡裝有 n 個澆灌噴頭。每個噴頭都裝在草坪中心線上(離兩邊各 w/2  公尺)。我們知道每個噴頭的位置(離草坪中心線左端的距離),以及它能覆蓋到的澆灌範圍。

請問:如果要同時澆灌整塊草坪,最少需要開啟多少個噴頭?

輸入包含若干組測試資料。

第一行乙個整數 t, 表示資料組數;

每組資料的第一行是整數 n、l 和 w,n≤15000;

接下來的 n 行,每行包含兩個整數,給出乙個噴頭的位置和澆灌半徑(上面的示意圖是樣例輸入第一組資料所描述的情況)。

output

每組測試資料的輸出佔一行,每行輸出乙個數字,表示要澆灌整塊草坪所需噴頭數目的最小值。如果所有噴頭都開啟也不能澆灌整塊草坪,則輸出 -1 。

sample input 

38 20 2

5 34 1

1 27 2

10 2

13 3

16 2

19 4

3 10 1

3 59 3

6 13 10 1

5 31 1

9 1sample output62

-1思路:很明顯的貪心問題,因為是一塊草地,所以要考慮長和寬,寬的話只需要在輸入資料的時候考慮一下半徑,如果半徑小於等於寬的二分之一就直接略過,在考慮長的時候不能以噴水的最長去考慮,要考慮和草地的交點,同時要考慮交點和交點之間要連起來或者互相覆蓋,交點的計算公式為:start=x-sqrt(radius^2-(w/2)^2),end=

x+sqrt(radius^2-(w/2)^2),並把最後乙個end求出來,如果大於長,就說明可以,否則輸出-1.

**如下:

#include#include#include#includeusing namespace std;

#define max_num 15001

typedef struct sprayerspr[max_num];

int cmp(sprayer a,sprayer b)

sort(spr+1,spr+cnt+1,cmp);

//cout<

int min_num = 0;

double sum = 0;

int flag = 1;

int i=1;

while(sum < l)

if(t==sum && t

}if(flag)

cout<

}}

噴水裝置 貪心演算法

長l公尺,寬w公尺的草坪裡裝有n個澆灌噴頭。每個噴頭都裝在草坪中心線上 離兩邊各w 2公尺 我們知道每個噴頭的位置 離草坪中心線左端的距離 以及它能覆蓋到的澆灌範圍。請問 如果要同時澆灌整塊草坪,最少需要開啟多少個噴頭?輸入包含若干組測試資料。第一行乙個整數t表示資料組數。每組資料的第一行是整數n ...

噴水裝置 貪心演算法

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0 輸入第一行m表示有m組測試資料 每一組測試資料的第一行有乙個整數數n,n表示共有n個噴水裝置,...

噴水裝置(一)貪心演算法

聽說這是 貪心演算法 的乙個簡單應用,雖說是簡單,但是對我來說,確實不簡單。說下面說有用的 題目描述 現有一塊草坪,長為20公尺,寬為2公尺,要在橫中心線上放置半徑為ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數ri 0輸入描述 第一行m表示有m組測試資料 每一組測試資料的第一行有乙...