噴水裝置(二)

2021-07-14 10:12:12 字數 1446 閱讀 9131

噴水裝置(二)

時間限制: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 1

4 5

2 10 6

4 5

6 5

樣例輸出 1 2

分析:

每個噴水裝置可以覆蓋到的矩形範圍是x-sqrt(r*r-h*h/4)到x+sqrt(r*r-h*h/4)。所以即可算出每個噴水裝置可以覆蓋的最左邊和最右邊。(開始時將r< h/2的去掉)。然後記錄當前已經覆蓋的最右邊preright(初始值為0),當preright小於w時,每次找出left小於preright且right的最大的裝置(最大覆蓋)。

ac**:

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10001;

struct edge

bool

operator

<(const edge &t) const

sort(vec.begin(),vec.end());

int cnt=0;

double preright=0;

double maxright=0;

int len=vec.size();

for(int i=0;iint j=i;

for(; jif(vec[j].right>=maxright)

}if(maxright>preright)

else

i=j-1;

}if(preright>=w)

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

else

printf("0\n");

vec.clear();

}return

0;}

噴水裝置 二

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