nyoj 12 噴水裝置(二) 貪心

2021-09-26 22:00:40 字數 1913 閱讀 2941

記憶體限制:64mb 時間限制:3000ms special judge: no

accepted:10 submit:30

有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n(n<=10000)個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。

第一行輸入乙個正整數n表示共有n次測試資料。

每一組測試資料的第一行有三個整數n,w,h,n表示共有n個噴水裝置,w表示草坪的橫向長度,h表示草坪的縱向長度。

隨後的n行,都有兩個整數xi和ri,xi表示第i個噴水裝置的的橫座標(最左邊為0),ri表示該噴水裝置能覆蓋的圓的半徑。

每組測試資料輸出乙個正整數,表示共需要多少個噴水裝置,每個輸出單獨佔一行。

如果不存在一種能夠把整個草坪濕潤的方案,請輸出0。

複製

2

2 8 6

1 14 5

2 10 6

4 56 5

1

2分析:

①、因為是圓組合成一條線的問題所以我們應該清晰認識到的是 --> 圓在該區域的有效長度 l = (sqrt(r^2 - (h/2)^2))

②、因為圓的有效長度為l,所以半徑小於 (h/2) 的圓完全沒有考慮的必要了(醬紫:要考慮的圓將會減少一定的數量)

步驟:①、根據輸入的位置座標和半徑情況構建出每個圓的有效區域,並將其存放在結構體中

②、從左到右遍歷尋找一組這樣的區域:「左端 小於 初始點」 && 「右端 大於 初始點」 && 「有端點的值最大」

③、將最大的右端點作為下乙個初始點

④、迴圈 ②、③ 步,知道能夠全部覆蓋草坪或噴泉用完

核心**:

1

double l_flag = 0

, r_flag;

2for(int i = 0; i < n; ++i)

312 --i;

13 cnt ++;

14 l_flag =r_falg;15}

16if (l_flag >=w)

1721 }

c/c++**實現(ac):

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10

11using

namespace

std;

1213

struct

node

14 p[10010

];17

18bool

cmp(node a, node b)

1922

23int

main ()

2442

else

4347

}48 sort(p, p +n, cmp);

4950

double l_flag = 0.0

, r_flag;

51for(int i = 0; i < n; ++i)

5261 --i;

62 l_flag =r_flag;

63 cnt ++;64}

65if(l_flag >=w)

6671}72

if(!flag) printf("

0\n"

);73}74

return0;

75 }

NYOJ 12 噴水裝置(二) 貪心)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...

NYOJ 12 噴水裝置(二)貪心

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...

NYOJ12 噴水裝置(二) 貪心

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...