• 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;
    }
  • 相关阅读:
    jq原创幻灯片插件slideV1.0
    jq原创弹出层折叠效果
    jq实现鼠标经过图片翻滚效果
    开源代码的来源
    名词解析
    Joomla软件的简单介绍
    Java集合类的使用
    笔记
    MySQL基础篇一
    MySQL基础篇一
  • 原文地址:https://www.cnblogs.com/a719525932/p/7826592.html
Copyright © 2020-2023  润新知