• NYOJ 12:喷水装置(二)(贪心,区间覆盖问题)


    12-喷水装置(二)

    • 内存限制:64MB 时间限制:3000ms 特判: No
    • 通过数:28 提交数:109 难度: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

    思路

    因为所有的喷水装置都在横向中心线上,所以可以利用圆与草坪边界的交点来转换成区间覆盖问题

    区间覆盖问题的详解:https://blog.csdn.net/chenguolinblog/article/details/7882316

    AC代码

    /*
    * @Author: WZY
    * @School: HPU
    * @Date:   2018-10-20 15:19:19
    * @Last Modified by:   WZY
    * @Last Modified time: 2018-10-20 17:09:48
    */
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <math.h>
    #include <limits.h>
    #include <map>
    #include <stack>
    #include <queue>
    #include <vector>
    #include <set>
    #include <string>
    #include <time.h>
    #define ll long long
    #define ull unsigned long long
    #define ms(a,b) memset(a,b,sizeof(a))
    #define pi acos(-1.0)
    #define INF 0x7f7f7f7f
    #define lson o<<1
    #define rson o<<1|1
    #define bug cout<<"---------"<<endl
    #define debug(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<"
    "
    const double E=exp(1);
    const int maxn=1e6+10;
    const int mod=1e9+7;
    using namespace std;
    struct wzy
    {
    	double l,r;
    }p[maxn];
    double x[maxn],r[maxn];
    bool cmp(wzy u,wzy v)
    {
    	if(u.l==v.l)
    		return u.r>v.r;
    	return u.l<v.l;
    }
    inline double MAX(double a,double b)
    {
    	return a>b?a:b;
    }
    inline double MIN(double a,double b)
    {
    	return a<b?a:b;
    }
    int main(int argc, char const *argv[])
    {
    	ios::sync_with_stdio(false);
    	#ifndef ONLINE_JUDGE
    	    freopen("in.txt", "r", stdin);
    	    freopen("out.txt", "w", stdout);
    	    double _begin_time = clock();
    	#endif
    	int t;
    	int n,w,h;
    	cin>>t;
    	while(t--)
    	{
    		cin>>n>>w>>h;
    		double res=h/2.0;
    		double _;
    		for(int i=0;i<n;i++)
    		{
    			cin>>x[i]>>r[i];
    			if(r[i]<=res)
    				_=0.0;
    			else
    				_=sqrt(r[i]*r[i]*1.0-res*res*1.0);
    			p[i].l=x[i]-_;
    			p[i].r=x[i]+_;
    		}
    		sort(p,p+n,cmp);
    		int ans=0;
    		double vis=0.0;
    		double __;
    		for(int i=0;i<n;i++)
    		{
    			if(p[i].l<=vis)
    			{
    				__=p[i].r;
    				while(p[i].l<=vis)
    				{
    					__=MAX(p[i].r,__);
    					i++;
    					if(i==n)
    						break;
    				}
    				vis=__;
    				i--;
    				ans++;
    			}
    			if(vis>=w)
    				break;
    		}
    		if(vis>=w)
    			cout<<ans<<endl;
    		else
    			cout<<0<<endl;
    	}
    	#ifndef ONLINE_JUDGE
    	    double _end_time = clock();
    	    printf("time = %lf ms.", _end_time - _begin_time);
    	#endif
    	return 0;
    }
  • 相关阅读:
    c++ stack 适配器
    错误记录
    css3动画,制作跑步运动,画笔画圆,之类的连贯性动作的方法
    关于$.cookie
    JavaScript中常见易犯的小错误
    关于内存泄漏
    Javascript的异步编程方法
    JavaScript中this关键词的四种指向
    javascript之回调函数小知识
    移动端的兼容性
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324335.html
Copyright © 2020-2023  润新知