给一个大圆,圆内有很多点,问大圆随机缩成一个固定半径的小圆后哪些点在小圆内的概率最大。
可以肯定点距离大圆边界的距离大于2*r那么这些点必然都是概率最大的,如果不存在这样的点,就找出离圆心最近的那些点即可。
#include <bits/stdc++.h> #define pb push_back #define mp make_pair #define x first #define y second #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define up rt,rt<<1,rt<<1|1 #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x,-1,sizeof(x)) #define LMissher using namespace std; typedef long long ll; typedef double db; const int M = 1e5+7; const double pi = acos(-1); const ll inf = 1e18; const int mod = 1e9+7; int _,n,ans[110]; ll R,r,x[110],y[110],e[110]; int main(){ #ifdef LMissher freopen("1.in","r",stdin); freopen("1.out","w",stdout); #endif scanf("%d",&_); while(_--){ int tot=0; ll mn=inf; scanf("%d%lld%lld",&n,&R,&r); for(int i=1;i<=n;i++){ scanf("%lld%lld",&x[i],&y[i]); ll dis=x[i]*x[i]+y[i]*y[i]; if(R*R+4*r*r-4*R*r>=dis){ ans[++tot]=i; } e[i]=dis; mn=min(mn,dis); } if(tot!=0){ printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("%d%c",ans[i],i==tot?'\n':' '); } else{ for(int i=1;i<=n;i++){ if(mn==e[i]) ans[++tot]=i; } printf("%d\n",tot); for(int i=1;i<=tot;i++) printf("%d%c",ans[i],i==tot?'\n':' '); } } return 0; }