题意:https://www.nowcoder.com/acm/contest/25/M
给你一个圆心为(0, 0),半径为R的大圈,里面有n个点
之后在大圈中随机生成一个半径为r的小圈,满足r<=R,当然小圈一定是被大圈包含或内切
问哪些点在小圈中的概率最高
找到临界点R=2*r 因为r足够小的时候 在原点附近的点都可以得到 在这n个点上 半径为r的圆周上 任意一个点都能当做小圆的圆心
当R>=2*r时 原点就一定会出现的 同理 只要小于等于R-2*r的点 一定100%出现
最后如果都不在这 那么就离原点最近的点
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<map> #include<vector> #include<math.h> #include<string> using namespace std; #define INF 0x3f3f3f3f #define LL long long #define N 10006 #define Lson rood<<1 #define Rson rood<<1|1 double a[N]; int q[N]; int main() { int T,n; scanf("%d",&T); while(T--) { double R,r,minn=INF,x,y; int t=0; scanf("%d%lf%lf",&n,&R,&r); double ans=fabs(R-2*r); for(int i=0; i<n; i++) { scanf("%lf%lf",&x,&y); a[i]=sqrt(x*x+y*y); minn=min(a[i],minn); if(a[i]<=ans) q[t++]=i+1; } if(t) { printf("%d ",t); for(int i=0; i<t; i++) printf("%d%c",q[i],i==t-1?' ':' '); continue; } for(int i=0; i<n; i++) { if(fabs(a[i]-minn)<1e-6) q[t++]=i+1; } printf("%d ",t); for(int i=0; i<t; i++) printf("%d%c",q[i],i==t-1?' ':' '); } return 0; }