#include<bits/stdc++.h>
using namespace std;
double eps=1e-8;
struct PP{
double x,y,dis;
}a[5050];
int ans[5050];
int main()
{
int n,m;
double R,r;
scanf("%d",&n);
while(n--)
{
scanf("%d%lf%lf",&m,&R,&r);
double ansr;
if(R-2*r>=0)
ansr=R-2*r;
else
ansr=2*r-R;
int j=0,flag=0;
double maxn=9999999;
for(int i=0;i<m;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
a[i].dis=sqrt(a[i].x*a[i].x+a[i].y*a[i].y);
if(a[i].dis<maxn)
maxn=a[i].dis;
if(a[i].dis<=ansr)
{
flag=1;
ans[j++]=i+1;
}
}
if(flag)
{
printf("%d\n%d",j,ans[0]);
for(int i=1;i<j;i++)
//{
printf(" %d",ans[i]);
// }
printf("\n");
}
else
{
double anss=0;
int j=0;
for(int i=0;i<m;i++)
{
if(fabs(a[i].dis-maxn)<eps)
{
ans[j++]=i+1;
}
}
printf("%d\n%d",j,ans[0]);
for(int i=1;i<j;i++)
//{
printf(" %d",ans[i]);
//}
printf("\n");
}
}
return 0;
}
这题看了几乎有一天了
终于有一丢丢地懂了
【分析】
首先有两种情况
R-2*r>=0(这种情况在以原点为圆心,R-2*r为半径的圆里面的点安全概率都相等,可为0,1,或其他,可多花几个图了解一下)
R-2*r<0(这种情况在以原点为圆心,2*r-R为半径的圆里面的点安全概率都为1,无论怎么画都会经过这里)
或者根本不会有在此区域内的点
那么就取离圆心最近的点