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