噴水裝置(二)

2021-06-28 11:08:17 字數 1673 閱讀 2080

時間限制:

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。

樣例輸入

2

2 8 6

1 14 5

2 10 6

4 56 5

樣例輸出

1

2

*自己不太會做這種題,測試了好多冊都沒成功,還好網上找了一片很符合自己想法的

*下面把思路說下:

*題目只給 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的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...