NYOJ12 喷水装置(二)【贪心】

喷水装置(二)

时间限制: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

来源

《算法艺术与信息学竞赛》

上传者

张云聪

线段上的区间覆盖问题。真无语,在CSDN发个代码还得翻墙…


#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>

#define maxn 10010

struct Node {
    double left, right;
} arr[maxn];

bool cmp(Node a, Node b) {
    return a.left < b.left;
}

int main()
{
    // freopen("data.in", "r", stdin);
    int ncase, id, result;
    int n, w, h, x, r;
    scanf("%d", &ncase);

    while (ncase--) {
        scanf("%d%d%d", &n, &w, &h);
        result = id = 0;

        while (n--) {
            scanf("%d%d", &x, &r);
            if (r * 2 <= h) continue;

            double len = sqrt(r*r - (h/2.0)*(h/2.0));
            arr[id].left = x - len;
            arr[id++].right = x + len;
        }

        std::sort(arr, arr + id, cmp);

        double flag = 0.0, flag2 = 0.0;
        for (int i = 0; i != id; ++i) {
            if (arr[i].left <= flag + 1e-7) {
                if (arr[i].right > flag2) flag2 = arr[i].right;
            } else {
                flag = flag2;
                ++result;
                if (flag + 1e-7 >= w) break;
                if (arr[i].left > flag + 1e-7) break;
                --i;
            }
        }
        if (flag2 + 1e-7 < w) result = 0;
        else if (flag + 1e-7 < flag2) ++result;

        printf("%d\n", result);
    }
    return 0;
}
时间: 2024-10-29 02:00:35

NYOJ12 喷水装置(二)【贪心】的相关文章

nyoj---12 喷水装置(二)--区间覆盖问题

喷水装置(二) 时间限制:3000 ms  |            内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据. 每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的

nyoj 12——喷水装置二——————【贪心-区间覆盖】

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,

喷水装置2 贪心

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,

一本通网站 1424:【例题3】喷水装置 及 贪心总结

原题   传送门 [题目描述] 长 LL 米,宽 WW 米的草坪里装有 nn 个浇灌喷头.每个喷头都装在草坪中心线上(离两边各 W2W2 米).我们知道每个喷头的位置(离草坪中心线左端的距离),以及它能覆盖到的浇灌范围. 请问:如果要同时浇灌整块草坪,最少需要打开多少个喷头? [输入] 输入包含若干组测试数据. 第一行一个整数 TT 表示数据组数: 每组数据的第一行是整数 nn.LL 和 WW: 接下来的 nn 行,每行包含两个整数,给出一个喷头的位置和浇灌半径(上面的示意图是样例输入第一组数据

野生前端的数据结构练习(12)贪心算法

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm 一.贪心算法 贪心算法属于比较简单的算法,它总是会选择当下最优解,而不去考虑单次递归时是否会对未来造成影响,也就是说不考虑得到的解是否是全局最优.在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如React中著名的DOM Diff算法中需要对比两棵DOM树,树的完

NYOJ 891 找点

找点 时间限制:2000 ms  |  内存限制:65535 KB 难度:2 描述 上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点.但是这几天LYH太忙了,你们帮帮他吗? 输入 多组测试数据. 每组数据先输入一个N,表示有N个闭区间(N≤100). 接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点. 输出 输出一个整数,表示最少需要找几个点. 样例输入 4 1 5 2 4 1 4 2 3 3 1 2 3 4 5 6 1 2 2 样例

20170612测试

问题 A: 装果子 时间限制: 1 Sec  内存限制: 128 MB提交: 96  解决: 54 题目描述 果园里有n颗果树,每棵果树都有一个编号i(1≤i≤n).小明已经把每棵果树上的果子都摘下来堆在了这棵树的下方,每棵树下方的果子体积为ai. 现在小明将拿来m个袋子把这些果子都装进袋子里.每个袋子的体积为v.小明会按照如下规则把果子装进袋子里: (a)从第1棵果树开始装起,由1到n一直装到第n棵果树. (b)如果这棵果树下的果子能全部装进当前这个袋子,就装进去:如果不能,就关上当前这个袋子

nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】

题意:... 这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖. 直接上代码: #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

贪心问题 区间覆盖 —— 喷水装置(二)

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,