噴水裝置2(nyoj12)

2021-06-19 03:14:23 字數 1453 閱讀 4469

時間限制:

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

**

/*對於輸入的每個點,先用勾股定理求出能覆蓋住矩形的起點和終點,然後進行一次排序,

如果最小的起點和最大的終點都不能超過矩形的長度範圍,則必定無解,取出起始點最靠前的點,(貪心的地方)

然後記錄下這個點的終點,遍歷這個起點到終點範圍內的所有其他的點,

並挑選其中終點最靠後的那個點作為下乙個終點的位置,並且計數器加一,

繼續向後遍歷,如果有區間接不上,則表明無解,成功遍歷到矩形最後,則直接輸出計數器的值*/

#include#include#include#define maxsize 10010

struct in

s[maxsize];

int cmp(const void *a, const void *b)

int main()

len = j;

for(i = 0; i < len; i++)

qsort(s, len, sizeof(s[0]), cmp);

if(s[0].start > 0 )

for(i = 0; i < len; i++)

} if(!flag_1)

continue;

else

double max;

num = 1;

while(tail < w)

if(max == tail)

tail = max;

num++;

}if(tail >= w)

printf("%d\n", num);

else

printf("0\n");

} }return 0;

}

nyoj 12 噴水裝置

有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。輸入 第一行輸入乙個正整數n表示共有n次測試資料。每一組測試資料的第一行...

nyoj 12 噴水裝置(二)

這道題是一道典型的貪心,可以轉化為區間覆蓋問題。首先把圓的覆蓋轉化成線段,草坪轉化為定長線段。即轉化成直線上的線段覆蓋問題,就是求用最少的線段數把整個區域都覆蓋了,不能覆蓋的輸出0。這道題做的有點慢,主要是細節沒注意好。用了好幾個測試資料才改正過來的。我的錯主要是處在len的計算上了,沒注意到len...

NYOJ 12 噴水裝置(二)

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