题意:。。。
这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖。
直接上代码:
#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; }题目链接:点击打开链接
nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】,布布扣,bubuko.com
nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】
原文:http://blog.csdn.net/shengweisong/article/details/38691359