zoukankan      html  css  js  c++  java
  • Nowcoder9983C.重力追击(暴力+少用sqrt)

    链接:https://ac.nowcoder.com/acm/contest/9983/C
    来源:牛客网

    在一个二维平面上有nmathit nn个敌人,第imathit ii个敌人可以描述为一个以(xi,yi)(x_{i},y_{i})(xi,yi)为圆心,rir_{i}ri为半径的圆。
    你每次可以对一个半径为Rmathit RR的圆范围内进行攻击(圆心自选,但圆心的横纵坐标必须为整数),对于与你攻击范围有交点的敌人都会被消灭。
    你总共可以发动kmathit kk次攻击,问最多能消灭多少敌人。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+100;
    int n,k,x[maxn],y[maxn],r[maxn],R;
    double getDis (int A,int B,int C,int D) {
        return ((A-C)*(A-C)+(B-D)*(B-D));
    }
    int main () {
        //对每一组敌人
        //如果它们距离一个整数点的距离都小于R 
        //说明可以消灭
        //14*14*1000*1000
        scanf("%d%d%d",&n,&k,&R);
        for (int i=1;i<=n;i++) scanf("%d%d%d",x+i,y+i,r+i); 
        if (k==3) {
            int ans=0;
            for (int ax=-7;ax<=7;ax++) {
                for (int ay=-7;ay<=7;ay++) {
                    for (int bx=-7;bx<=7;bx++) {
                        for (int by=-7;by<=7;by++) {
                            for (int cx=-7;cx<=7;cx++) {
                                for (int cy=-7;cy<=7;cy++) {
                                    int sum=0;
                                    for (int i=1;i<=n;i++) {
                                        if (getDis(x[i],y[i],ax,ay)<=(R+r[i])*(R+r[i])) sum++;
                                        else if (getDis(x[i],y[i],bx,by)<=(R+r[i])*(R+r[i])) sum++;
                                        else if (getDis(x[i],y[i],bx,cy)<=(R+r[i])*(R+r[i])) sum++;
                                    }
                                    ans=max(ans,sum);
                                }
                            }
                        }
                    }
                }
            }
            printf("%d
    ",ans);
            return 0;    
        }
        if (k==2) {
            int ans=0;
            for (int ax=-7;ax<=7;ax++) {
                for (int ay=-7;ay<=7;ay++) {
                    for (int bx=-7;bx<=7;bx++) {
                        for (int by=-7;by<=7;by++) {
                            int sum=0;
                            for (int i=1;i<=n;i++) {
                                if (getDis(x[i],y[i],ax,ay)<=(R+r[i])*(R+r[i])) sum++;
                                else if (getDis(x[i],y[i],bx,by)<=(R+r[i])*(R+r[i])) sum++;
                            }
                            ans=max(ans,sum);
                        }
                    }
                }
            }
            printf("%d
    ",ans);
            return 0;    
        }
        if (k==1) {
            int ans=0;
            for (int ax=-7;ax<=7;ax++) {
                for (int ay=-7;ay<=7;ay++) {
                    int sum=0;
                    for (int i=1;i<=n;i++) {
                        if (getDis(x[i],y[i],ax,ay)<=(R+r[i])*(R+r[i])) sum++;
                    }
                    ans=max(ans,sum);
                }
            }
            printf("%d
    ",ans);
            return 0;    
        }
    }
  • 相关阅读:
    OS模块功能
    read()、readline()、readlines()区别
    【ML-0-2】矩阵求导-定义法和微分法
    【ML-0-1】矩阵求导-定义和求导布局
    博客园转文章的方法
    风格迁移论文--Arbitrary style transfer in real-time with adaptive instance normalization
    【TF-3-2】Tensorflow-mnist的手写识别
    【TF-3-1】Tensorflow--简单线性拟合
    图像分割简介
    图像表示与图像处理的基本概念
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14381178.html
Copyright © 2011-2022 走看看