時間限制:
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。
樣例輸入
22 8 6
1 14 5
2 10 6
4 56 5
樣例輸出
12
*自己不太會做這種題,測試了好多冊都沒成功,還好網上找了一片很符合自己想法的
*下面把思路說下:
*題目只給 x座標還有圓半徑,也就是說 半徑小於 矩形高度一般的就不用考慮,然後將獲取的有用資料放入陣列
* 考慮區間劃分友三種情況如下
區間覆蓋問題分成三種情況(「---」表示區間)第一種情況
a -----------b --------------
c -----------此時沒有能覆蓋b和c之間的區域
第二種情況
a -----------
b ------------
c -------------
此時需要選擇a,b,c三個區間
第三種 a -----------
b -------------
c ---------------
按照漸近原則 第乙個圓左邊界應該(此時左邊界在矩形外)要最靠近矩形(題目要求「用最少的裝置」) 且圓右邊界盡量長 所以要先迴圈找出最此圓
for(i->n)
if(p[i].l <= left && maxr < p[i].r )
maxr = p[i].r
其後圓的測試方法 和上面相同。
*/#include using namespace std;
#include#include struct point
p[10005];
int main(int argc, char *argv)
}//在執行下面程式時,個人認為應該先排序這樣迴圈次數會少
n=i;ans=0;
float start=0,end=w,maxr;
while(startmaxr)
maxr=p[i].r;
if(maxr==start)
ans++;
start=maxr;
}cout<
噴水裝置 二
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...
噴水裝置(二)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...
噴水裝置(二)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...