AHOI2017初中组题解

来源:互联网 发布:克拉丽丝claris知乎 编辑:程序博客网 时间:2024/03/29 05:40

AHOI2017初中组题解

AHOI初中组也是结束了一个多星期了,写一下题解吧,也算是巩固了:

https://www.luogu.org/problem/show?pid=3717

博客主因为去写了高中组的题目被虐的很惨,没拿到初中组的题目,这是洛谷上简化版的题目。


题目描述

-一个n*n的网格图上有m个探测器,每个探测器有个探测半径r,问这n*n个点中有多少个点能被探测到。


输入输出格式

输入格式:

第一行3个整数n,m,r接下来m行,每行两个整数x,y表示第i个探测器的坐标

输出格式:

能被探测到的点的个数

输入样例

5 2 13 34 2

输出样例

8

说明

1<=n,m<=100


解法

由于题目中说,n,m<=100,所以O(n²m)的暴力一定是能过的,所以只要暴力就好了
不过比较重要的是,两个点之间的直线距离公式要知道,不然不好判


dis(x,y,x1,y1)=sqrt(sqr(x-x1)+sqr(y-y1))

其中sqr(x) 表示x²,sqrt(x)表示根号x(平方根)

同三角形斜边公式,具体可查阅 勾股定理
http://baike.baidu.com/link?url=QoX2Fmq4W_A3u4PLqfOth1ea8NfxLdGNcIc_eDZwmdmKLnVblXV5YD4kHY_3nUphugwLxH0tWj0VRmNZyrO8ryGqTP9y0J4voh41ZCD9yxLcT7c3XOSXM6DLabjvS19e

具体写法

g[i][j]表示行坐标为i,列坐标为j的点是否被覆盖到

每次读入探测器的位置就从1,1到n,n扫一遍,算距离,标记,注意距离用double类型

最后ans统计多少个g[i][j]==true的点

代码

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>using namespace std;int sqr(int x) {return x*x;}int main(){    int n,m,r;    scanf("%d%d%d",&n,&m,&r);    bool g[102][102];    memset(g,false,sizeof(g));    for (int i=1;i<=m;i++)    {        int x,y;        scanf("%d%d",&x,&y);        for (int x1=1;x1<=n;x1++) for (int y1=1;y1<=n;y1++)        {            double dis=sqrt(sqr(x1-x)+sqr(y1-y));            if (dis<=double(r)) g[x1][y1]=true;        }    }    int ans=0;    for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (g[i][j]) ans++;    printf("%d",ans);}

T1就是这样了,追逐细节的同学可以把扫描范围调小一些,常数会优一点

过两天上T2。

0 0
原创粉丝点击