• 10382


    Problem E
    Watering Grass
    Input:
     standard input
    Output: standard output
    Time Limit: 3 seconds

    n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each sprinkler is installed at the horizontal center line of the strip. For each sprinkler we are given its position as the distance from the left end of the center line and its radius of operation.

    What is the minimum number of sprinklers to turn on in order to water the entire strip of grass?

    Input

    Input consists of a number of cases. The first line for each case contains integer numbers nl and w with n <= 10000. The next n lines contain two integers giving the position of a sprinkler and its radius of operation. (The picture above illustrates the first case from the sample input.)

    Output

    For each test case output the minimum number of sprinklers needed to water the entire strip of grass. If it is impossible to water the entire strip output -1.

    Sample input

    8 20 2

    5 3

    4 1

    1 2

    7 2

    10 2

    13 3

    16 2

    19 4

    3 10 1

    3 5

    9 3

    6 1

    3 10 1

    5 3

    1 1

    9 1

    Sample Output
    
    
    6

    2

    -1

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #define min 1e-8
    struct data{double x; double y;}p[10005];
    int cmp( const void *a ,const void *b) 
    {return (*(data *)a).x>(*(data *)b).x?1:-1;} 
    int main()
    {
    	int n,l,w,x,r,i,j;
    	while(scanf("%d%d%d",&n,&l,&w)!=EOF)
    	{
    		int c=0,f=0,ans=0;
    		double s=0,e=0,d;
    		for(i=0;i<n;i++)
    		{
    			scanf("%lf%d",&d,&r);
    			if(r<w/2.0) continue;
    			double temp=sqrt((double)r*r-(double)w*w/4.0);
    			p[c].x=d-temp;
    			p[c].y=d+temp;
    			c++;
    		}
    		qsort(p,c,sizeof(p[0]),cmp);
    		for(i=0;i<c;i++)
    			if(p[i].x>e) 
    				break;
    			else if(p[i].y>e)  
    			{  
    				for(j=i;j<c&&p[j].x-s<min;j++)  
    					if(e-p[j].y<-min) 
    						e=p[j].y;  
    				ans++;  
    				if(e>=l)  
    				{f=1;break;}  
    				s=e;  
    			}  
    			if(f)  
    				printf("%d
    ",ans);  
    			else  
    				printf("-1
    ");  
    	}
    	return 0;
    }
  • 相关阅读:
    L1-047 装睡 (10分)
    QT 文件的读写,将txt中的数据存储到QVector
    C++Primer第五版 第十二章 动态内存
    C++Primer第五版 第十一章 关联容器
    从《上瘾》到 《不被干扰》
    MySQL模糊查询用法(正则、通配符、内置函数等)
    MySQL-SQL优化总结
    MySQL中特别实用的几种SQL语句
    public、private、protected 和 default
    DO,DTO,VO,POJO详解
  • 原文地址:https://www.cnblogs.com/riskyer/p/3235406.html
Copyright © 2020-2023  润新知