1 条题解

  • 0
    @ 2025-4-17 15:11:59
    #include<algorithm>
    #include<bits/stdc++.h>
    #include<cstring>
    #include<cmath>
    const int maxm=1111;
    using namespace std;
    struct Circle{
    	double x,y;
    	double r;
    }c[maxm]; 
    struct Line{
    	double l,r;
    }line[maxm];
    double dist(int X,int Y,Circle A){
    	return sqrt( (X-A.x)*(X-A.x)+(Y-A.y)*(Y-A.y) );
    }
    bool cmp(Line A,Line B){
    	return A.l<B.l;
    }
    int main()
    {
    	
    	 
    	int N;
    	while(scanf("%d",&N)!=EOF && N!=0)
    	{
    		double x,y;scanf("%lf %lf",&x,&y);//灯位置
    		for(int i=1;i<=N;i++)
    		{
    			scanf("%lf %lf %lf",&c[i].x,&c[i].y,&c[i].r);
    		} 
    		for(int i=1;i<=N;i++)
    		{
    			int flag=x>c[i].x?1:-1;
    			double d=dist(x,y,c[i]);
    			double a=asin(c[i].r/d);//角a
    			//int rra=0;
    			//if(flag==1) 
    			//	rra=x-c[i].x;
    			//else
    			//	rra=c[i].x-x;
    			double b=asin((x-c[i].x)/d);
    			double ag1=a+b,ag2=b-a;
    			line[i].l=x-y*tan(ag1);
    			line[i].r=x-y*tan(ag2);
    		}
    		sort(line+1,line+N+1,cmp);
    		double ll=line[1].l;
    		double rr=line[1].r;
    		for(int i=2;i<=N;i++)
    		{
    			if(line[i].l>rr)
    			{
    				printf("%.2f %.2f\n",ll,rr);
    				ll=line[i].l;
    				rr=line[i].r;
    			}
    			else 
    				rr=max(line[i].r,rr);
    		}
    		printf("%.2lf %.2lf\n\n",ll,rr);
    	}
    	return 0;
    }
    • 1

    信息

    ID
    376
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者