CCPC 2017秦皇岛 M Safest Buildings (给一个圆心在原点的大圆R ,以及n个点 在大圆内存在一个小圆r 问那些点同时在两圆的概率最大)

题意: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;
}
原文地址:https://www.cnblogs.com/a719525932/p/7826592.html