記憶體限制: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。
複製
22 8 6
1 14 5
2 10 6
4 56 5
12分析:
①、因為是圓組合成一條線的問題所以我們應該清晰認識到的是 --> 圓在該區域的有效長度 l = (sqrt(r^2 - (h/2)^2))
②、因為圓的有效長度為l,所以半徑小於 (h/2) 的圓完全沒有考慮的必要了(醬紫:要考慮的圓將會減少一定的數量)
步驟:①、根據輸入的位置座標和半徑情況構建出每個圓的有效區域,並將其存放在結構體中
②、從左到右遍歷尋找一組這樣的區域:「左端 小於 初始點」 && 「右端 大於 初始點」 && 「有端點的值最大」
③、將最大的右端點作為下乙個初始點
④、迴圈 ②、③ 步,知道能夠全部覆蓋草坪或噴泉用完
核心**:
1double 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 #include8 #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的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...