题意:。。。
这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖。
直接上代码:
#include <stdio.h>
#include <math.h>
#include <algorithm>
using std::sort;
struct node{
double le, ri;
}s[1005];
int cmp(node a, node b)
{
return a.le < b.le;
}
int main()
{
int n, t;
double w, h;
scanf("%d", &t);
while(t --){
scanf("%d%lf%lf", &n, &w, &h);
h /= 2; //要除去2
int i, j;
double temp, r;
for(i = 0, j = 0; i < n; i ++){
scanf("%lf%lf", &temp, &r);
if(r <= h) continue;//如果不能,喷洒到俩边或刚好喷洒到两边
else{
double temp1 = sqrt(r*r-h*h);//求最长能够形成矩形的宽度
s[j].le = temp -temp1;//左边界
s[j++].ri = temp+temp1;//右边界
}
}
sort(s, s+j, cmp);//排序
// for(i = 0; i < j; i ++){
// printf("%lf %lf..\n", s[i].le, s[i].ri);
// }
if(s[0].le > 0) {printf("0\n"); continue;} //如果第一个要大于0, 就是0到不了,直接输出0
double end = 0;
i = 0;
int cou = 0;
while(end <= w&&i < j&&cou <= n){//区间覆盖核心代码这里的
temp = end;
while(s[i].le <= end&&i <j ){
if(s[i].ri > temp) temp = s[i].ri;
i++;
}
end = temp+0.000001;//每次都只加上0.00001,俩区间有断点,就能区分
++cou;
}
if(end < w||cou > n){//如果cou>n 就说明有断点, end<w说明到达不了w
printf("0\n");
}
else{
printf("%d\n", cou);
}
}
return 0;
}
题目链接:点击打开链接