1 条题解

  • 0
    @ 2025-8-24 21:33:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Atmizz
    我是一个老实人

    搬运于2025-08-24 21:33:42,当前版本为作者最后更新于2019-04-17 09:08:00,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    枚举!!!这个最简单(因为我不会其他的。。)

    提醒一下:如果您还没看题的话,请先回去看题,题目有点难以理解,我第一遍就理解错了。

    • 恐怖组织只有一个炸弹(真穷);
    • 控制炸弹范围,避免超范围(有点难想到,我是借鉴了一位dalao的思路)。

    输入一个街区坐标,然后就开始枚举街区,看是否在范围内。尽量不要开数组,因为数据范围大,容易爆空间,连编译都不过(手动滑稽)。

    再就是,两点之间的距离公式->


    sqrt((x-a)*(x-a)+(y-b)*(y-b))
    

    初中的知识点,必须会啊!!!!这个题与P3717 cover类似,大家可以做一下。

    再一个,此题容易超时,容易得50分(实践出真知,我实践了),建议大家使用函数计算距离。


    double dis(int x,int y,int a,int b)//取距离函数,很重要 
    {
        return sqrt((x-a)*(x-a)+(y-b)*(y-b));//两点之间距离公式 
    }
    

    好,该说的的都说完了,上code:


    #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;//完美の结束!!! 
    }
    
    • 1

    信息

    ID
    1039
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者