码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ - 3993 - Safest Buildings (数学)

时间:2018-10-02 22:21:30      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:tail   圆心   需要   return   str   vector   大小   建筑   int   

参考:https://blog.csdn.net/KuHuaiShuXia/article/details/78408194

题意:

描述了吃鸡刷圈的问题,给出楼的坐标点,和两次刷圈的半径R和r,现在寻找最安全的地方

思路:

判定安全方法:每个点以r为半径画圆,与以原点为圆心,半径为R的圆的重合部分的大小为比较基准

那么问题又转化为与原点的距离

如果R>2r,那么以大圈圆心为圆心的R-2r范围内的建筑的安全概率是相等的。
反之,以大圈圆心为圆心的2*r-R范围内的建筑的安全概率是相等的。

我们只需要判断是否是一致概率,然后添加到结果集合,使用vector

代码:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;

int main() {
    int t, n, R, r;
    scanf("%d", &t);
    while(t--) {
        vector<int> vi;
        int x, y, d, inf = 0xf3f3f3f, tmp;
        scanf("%d %d %d", &n, &R, &r);
        if(R >= 2*r) d = R - 2*r;
        else d = 2*r - R; 
        for(int i = 1; i <= n; i++) {
            scanf("%d %d", &x, &y);
            if(x*x+y*y <= d*d) tmp = 0;
            else tmp = x*x+y*y;
            if(tmp < inf) {
                inf = tmp;//更新最小
                vi.clear();
            }
            if(tmp == inf) vi.push_back(i);
        }
        printf("%d\n", vi.size());
        for(int i = 0; i < vi.size(); i++) {
            printf("%d%c", vi[i],i==vi.size()-1?'\n':' ');
        }
        
    }   
    return 0;
}

ZOJ - 3993 - Safest Buildings (数学)

标签:tail   圆心   需要   return   str   vector   大小   建筑   int   

原文地址:https://www.cnblogs.com/somliy/p/9738029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!