题目背景
一个恐怖组织在一座城市中安放了定时炸弹,其威力巨大,现在这里的警长想知道最坏的情况下会有多少街区受威胁。
题目描述
在一个城市有 N×M 个街区,每个街区由坐标描述,如图所示:
1 | 2 | 3 | ⋯⋯ | M | |
---|---|---|---|---|---|
1 | (1,1) | (1,2) | (1,3) | ⋯⋯ | (1,M) |
2 | (2,1) | (2,2) | (2,3) | ⋯⋯ | (2,M) |
3 | (3,1) | (3,2) | (3,3) | ⋯⋯ | (3,M) |
⋮ | ⋱ | ||||
N | (N,1) | (N,2) | (N,3) | ⋯⋯ | (N,M) |
现在已知有一个恐怖组织在其中的一个街区安放了定时炸弹,其威力为 t,即所有到这个街区的直线距离小于等于 t 的街区都会受威胁,已知有 k 个可能的炸弹安放位置,现在这里的警长想知道最坏的情况下会有多少街区受威胁。
输入格式
第一行四个正整数 n,m,k,t。
接下来 k 行每行两个正整数 xi,yi,描述每个可能安放炸弹的街区。
输出格式
一个正整数为在最坏情况下有多少街区会受威胁。
输入输出样例
输入 #1
4 5 3 2 1 2 3 4 4 5输出 #1
11
说明/提示
数据规模与约定
对于20%的数据 k=1。
对于 50% 的数据 1≤n,m≤1000,1≤k≤20,1≤t≤100。
对于 100%100% 的数据 1≤n,m≤,1≤k≤50,t≤300。
fixed by @Cppsteve
题目难度
普及-
参考思路
注意:
- 恐怖组织只有一个炸弹;
- 控制炸弹范围,避免超范围。
输入一个街区坐标,然后就开始枚举街区,看是否在范围内。尽量不要开数组,因为数据范围大,容易爆空间,连编译都不过。
参考代码
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,k,t,x,y,ans,maxn=0;//ans表示一个炸弹可以炸的街道,maxn取最大的
double dis(int x,int y,int a,int b)//取距离函数,很重要
{
return sqrt((x-a)*(x-a)+(y-b)*(y-b));//两点之间距离公式
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&t);//输入
for(int q=1;q<=k;q++) {
ans=0;
scanf("%d%d",&x,&y);//线上计算
for(int i=max(x-t,1);i<=min(n,x+t);i++) {
for(int j=max(y-t,1);j<=min(m,y+t);j++) {
if(dis(i,j,x,y)<=t)//小于爆炸范围
ans++;//计数器加加
}
}
if(maxn<ans)//取最大值
maxn=ans;
}
printf("%d",maxn);
return 0;
}