P2484 [SDOI2011]打地鼠 题解

搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX) 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 阅读详情

P2484 [SDOI2011]打地鼠 题解

题目

P2484 [SDOI2011]打地鼠 题解

分析

锤子每次只能将每个洞里打掉一只地鼠,所以对于每次击打,都会打掉 r × c r\times c r×c 只地鼠。而每次击打的范围内的每个洞里必须都要有地鼠,所以地鼠的总数必须被 r × c r\times c r×c 整除。

因为每只地鼠都需要被干掉,所以如果当前方案成立,总可以通过不断在地图左上角寻找有地鼠的洞,再以这个洞为锤子击打的范围的左上角进行击打来打完所有地鼠。

而如果在打地鼠的时候发现击打范围内有已经没有地鼠的洞或者会打到地图外面的话,当前方案就不成立。

思路

由于地图只是个 100 × 100 100\times 100 100×100 的矩形,所以我们完全可以枚举 r r r 和 c c c,只要锤子覆盖的区域大小即 r × c r\times c r×c 能整除地图中的地鼠总数就进行尝试。

根据上文的分析,我们只需要在整个地图左上角找到一个还剩的有地鼠的洞,设这个洞的坐标为 ( x , y ) (x,y) (x,y),然后进行以下操作:

  1. 判断 ( x + r − 1 , y + c − 1 ) (x+r-1,y+c-1) (x+r−1,y+c−1) 是否在地图外面。在的话说明这个锤子不满足题意,结束,否则进行下一步。
  2. 判断 ( x , y ) (x,y) (x,y) 到 ( x + r − 1 , y + c − 1 ) (x+r-1,y+c-1) (x+r−1,y+c−1) 范围内有没有空地鼠洞。如果有的话,说明这个锤子不满足题意,结束,否则进行下一步。
  3. 将 ( x , y ) (x,y) (x,y) 到 ( x + r − 1 , y + c − 1 ) (x+r-1,y+c-1) (x+r−1,y+c−1) 范围内的地鼠数量减一。
  4. 将这个锤子的击打总次数加一。
  5. 回到第 1 1 1 步操作直到所有地鼠洞为空。

因为 ( x + y ) (x+y) (x+y) 的地鼠在锤子大小满足题意的情况下再怎么样都会被打完,所以我们也可以直接将 ( x , y ) (x,y) (x,y) 到 ( x + r − 1 , y + c − 1 ) (x+r-1,y+c-1) (x+r−1,y+c−1) 范围内的地鼠数量减 ( x , y ) (x,y) (x,y) 里的地鼠数量(相当于连续打 ( x , y ) (x,y) (x,y) 里的地鼠数量次),判断减之后有没有为负的洞,有说明锤子不满足题意,没有的话将锤子总击打次数加上 ( x , y ) (x,y) (x,y) 里的地鼠数量,然后继续尝试。这算是个小优化。

最后就输出所有可行的锤子中击打次数最小的值就好了。更详细的解释请参阅代码里的注释。

代码

#pragma GCC optimize(2)
#include <cstdio>
using namespace std;
int n, m, tot = 0;
long long ans = 1145141919810;
int maze[105][105];
int tmaze[105][105]; //因为要尝试多次且每次尝试都会修改地鼠洞内地鼠的数量,
                     //我们需要在每次尝试前复制原始的地图
long long Min(long long a, long long b)
{
    return a > b ? b : a;
}
inline bool findfirst(int &x, int &y) //从地图左上角找到第一个有地鼠的地鼠洞,返回是否找到
{
    for (register int i = 1; i <= n; i++)
    {
        for (register int j = 1; j <= m; j++)
        {
            if (tmaze[i][j])
            {
                x = i, y = j; //找到就将这个洞的坐标传回去
                return 1;
            }
        }
    }
    return 0;
}
inline void dfs(int r, int c, int cnt) //参数表示锤子大小和花费
{
    int x, y;             //用x,y表示目前在左上角找到的地鼠洞为(x,y)
    if (!findfirst(x, y)) //如果没找到有地鼠的洞说明找完了,更新答案并结束
    {
        ans = Min(ans, 1ll * cnt);
        return;
    }
    if (x + r - 1 > n || y + c - 1 > m || cnt >= ans) //操作1,如果要打左上角的地鼠
                                                      //洞锤子会超过地图,说明这组
                                                      //方案不成立
        return;
    int red = tmaze[x][y]; //操作3,将(x,y)到(x+r-1,y+c-1)内的地鼠数量都减去(x,y)内的地鼠数
    for (register int i = x; i <= x + r - 1; i++)
    {
        for (register int j = y; j <= y + c - 1; j++)
        {
            tmaze[i][j] -= red;
            if (tmaze[i][j] < 0) //操作2,如果这个洞里的地鼠数量为负说明这组方案不成立
                return;
        }
    }
    dfs(r, c, cnt + red); //操作4、5,加上操作次数,继续打剩下的地鼠
    return;
}
void cpymaze()
{
    for (register int i = 1; i <= n; i++)
        for (register int j = 1; j <= m; j++)
            tmaze[i][j] = maze[i][j]; //复制原始的地图
}
signed main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            scanf("%d", &maze[i][j]);
            tot += maze[i][j]; //记录地鼠总数
        }
    }
    for (int r = 1; r <= n; r++)
    {
        for (int c = 1; c <= m; c++)
        {
            if (tot % (r * c) == 0) //分析中所说的,只有锤子的覆盖大小能整除地鼠总数才行
            {
                cpymaze();
                dfs(r, c, 0);
            }
        }
    }
    printf("%lld\n", ans);
}
Python实战日志_P4_图书馆Web API服务 目标:使用Flask将图书馆系统升级为RESTful API服务,掌握Web开发基础难度:⭐⭐⭐⭐☆预计学习时间:75分钟前置要求:已完成第3篇《个人图书馆管理系统》 阅读详情

相关推荐

Anaconda安装教程傻瓜教程

网上好多教程找的我心好累,为了方便新手安装,我这边整理了大致详细的教程,参考了好几个大佬的教程,废话不多说,直接开始~ **前言:**有人纠结先安装python还是安装anaconda,这边的建议是装anaconda,就不需要单独装python了。 其次,有小伙伴的Anaconda的安装分两种情况: 情况一:电脑现在没有装python或者现在装的可以卸载掉(装Anaconda时先卸python); 情况二:电脑目前装了python,但想保留它;

zlc2351951436的博客 5万+

P2484 [SDOI2011]打地鼠-题解报告

0x00 思路 思路很简单,直接暴力枚举边长,然后模拟即可,中间有一些小优化,不然会超时。 0x01 暴力&模拟 既然求的是最少的挥舞次数,那么肯定能挥舞,不然无法计算,所以我们写一个 check 函数,里面传入 x,yx,yx,y 表示能否用长为 xxx 和宽为 yyy 的锤子锤完所有的地鼠。由于 aaa 数组随时有可能被更改,所以我们用一个辅助数组 bbb 来存储当前每个格子的地鼠数量,我们需要依次枚举每一个格子,如果这个格子没有地鼠,跳过即可,如果有地鼠,那么需要枚举以 xxx 为长,yyy

cqbzfsk的博客 425

IPD的分析工具与模型(十六)CBB公用基础模块管理实现资源共享,缩短开发周期降低成本

CBB流程的开发环节,基于CBB规划中所识别和设计的CBB,进行CBB的详细设计(包括参数设计和接口设计),并最终实现CBB的落地开发。作为特殊类型的技术构件,CBB的开发流程,可沿用技术开发中的构件开发流程,具体包括概念、计划、开发和迁移等步骤,具体可参见前文的相关介绍。有了蓝图与架构设计,落地实施是关键攻坚。具体工作内容包括:具体工作内容包括:a. 以相似性、聚类、相对独行性、可组合、可扩展性、可维护性等原则为指导,按照产品的功能特征和业务类型,聚焦零散的功能点,形成功能模块,实现产品功能模块的划分;

Easyways1的博客 1378

c++ 入门oj1563打地鼠题解

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weixin_44617853的博客 1749

ComfyUI 的 LoRA 训练:秋叶 LoRA-scripts 参数设置与测试方法详解

秋叶 LoRA-scripts 的参数设置需结合理论(如模型原理、优化器机制)和硬件条件(显存、算力),新手可先按推荐值起步,再逐步调整。测试时,loss 值帮你判断训练是否正常,XYZ 图表法帮你找到最佳使用参数。掌握这些知识,你就能避开 LoRA 训练的常见坑,从 “盲目调参” 变为 “精准训练”。

2301_78150483的博客 2402

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

【SDOI2011】打地鼠

【SDOI2012】Longge的问题 【题目描述】 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了: 给定一个整数N,你需要求出Σgcd(i, N)(1 【输入】 输入包含一个整数 N ,如题所示 【输出】 输出包含一个整数,为所求的答案。 【输入样例】 6 【输出样例】 15 【题解】 欧拉函数phi(x)等于不超过

OI技术宅 1274

汽车OTA自动化测试解决方案

目前OTA远程升级技术已成为众多汽车制造商的标配。由于OTA升级可能会带来潜在的风险(特别是包含ECU固件更新的FOTA升级),针对OTA系统的测试过程就尤为重要。

东舟技术的博客 7760

BZOJ P2241[sdoi2011]打地鼠

直接暴力枚举锤子的长宽 然后判断 别忘了加点剪枝,不加可能会痿 #include #include #include #define inf 0x7fffffff using namespace std; int n,m,sum,mp[101][101],t[101][101],ans=inf; void work(int x,int y){ for(int i=1;i<=n;i++){

mdnd1234的博客 392

HFSS15 win10_64位破解

HFSS15 win10_64位破解 找到的别人的软件,但在首次安装时失败了,并不能patched。寻找了几种方法,已成功安装。在此写下安装经验,供大家参考。 软件安装包以及破解软件: 链接:https://pan.baidu.com/s/1MMjV_31maU5QD6fmI4zfIA 提取码:yj4q 在安装之前,建议关闭杀毒软件。 Step1:进入HFSS150Win64安装包,点击au...

玉笙寒 4万+

MediaPipe+Unity动作捕捉实战:如何用普通摄像头驱动3D人物模型(附避坑指南)

本文详细介绍了如何利用MediaPipe和Unity实现低成本动作捕捉,仅需普通摄像头即可驱动3D人物模型。通过MediaPipe的3D坐标预测能力,结合Unity的骨骼映射优化,解决单目摄像头下的三维重建难题,并提供实战避坑指南和性能优化技巧,帮助开发者快速实现专业级的人物模型驱动效果。

weixin_29047545的博客 357

2241: [SDOI2011]打地鼠

题目链接题目大意:给定一个m*n的洞穴矩阵,每个洞穴里面有若干地鼠,我们需要选定一个r*c的锤子进行击打,每次击打必须保证r*c的范围内所有洞穴均有地鼠,且每次击打只会打掉每个洞穴恰好一只地鼠,求最小击打次数题解:由于数据水,这题O((nm)3),O((nm)2),二分乱搞都能过……O((nm)^3),O((nm)^2),二分乱搞都能过……首先枚举长和宽,然后判断可行性,判断的时候就是二维区间修改+

蒟蒻的Bzoj记录 634

使用DrissionPage和自动化技术实现得物鞋子信息爬取

本文介绍了一个基于DrissionPage技术的得物鞋子信息采集系统,能自动化采集商品图片、价格等数据并保存为Excel。系统采用浏览器模拟技术处理动态加载内容,通过XPath定位元素,实现智能交互和完整数据采集。关键技术包括:图片URL提取与下载、Excel数据集成与图片嵌入、文件名安全处理等。项目适用于市场分析和学术研究,强调必须遵守法律法规和平台规则,仅用于非商业用途。与API爬虫相比,浏览器自动化能更好处理现代Web应用,但需注意知识产权保护。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1666

题解 luogu P2484 【[SDOI2011]打地鼠】BZOJ2241 O(N^2.5)

这道题最好可以做到n2.5n2.5n^{2.5},但由于数据弱可以让一些错误的n2n2n^2算法AC 将行和列分开考虑。 枚举每个点时用前缀和记录要减去的数(见注释) 枚举行数(列数)时使用每一行(列)的和的gcd的约数。 #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; #include&amp;lt;algorithm&amp;gt; #include&amp;

Ansicht's Blog 314

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

洛谷 P2484 [SDOI2011]打地鼠

洛谷 P2484 [SDOI2011]打地鼠题目题目描述打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉所有的地鼠。你认为这锤子太没用了,所以你改装了锤子,增加了锤子与地面的接触面积,使其每次可以

faojie的博客 908

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

P2484 [SDOI2011]打地鼠

\(\color{#0066ff}{ 题目描述 }\) 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉所有的地鼠。你认为这锤子太没用了,所以你改装了锤子,增加了锤子与地面的接触面积,使其每次...

weixin_30826095的博客 215

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【BZOJ2484】[SDOI2011]打地鼠(暴力)

【BZOJ2484】[SDOI2011]打地鼠(暴力) 题面 BZOJ 洛谷 题解 看到数据范围这题就应该是一个暴力题了。 先考虑假如我们知道了锤子的大小\(R*C\),那么显然只需要从左上角开始从左往右从上往下一个个砸就行了,因为你砸到当前位置之后左上角一定没有限制了,只有当前这个位置还有限制。所以直接暴力就是\(O(n^6)\)的了。似乎可以\(BIT\)之类的优化一下,差不多可以做到\(O(...

weixin_30646315的博客 230

P2484 [SDOI2011] 枚举 + 二维差分

题意 传送门 P2484 [SDOI2011]打地鼠 题解 O(N2)O(N^2)O(N2) 枚举 r,cr,cr,c,判断打地鼠的可行性,更新答案。对于仍存在 ttt 只地鼠的最左上角的点 (x,y)(x,y)(x,y),其打击范围时确定的,即打击的矩形区域左上角为 (x,y)(x,y)(x,y),打击的次数为 ttt。 那么依次遍历二维区域的点,同时统计各区域已打击的次数即可,朴素的处理复杂度 O(N4)O(N^4)O(N4),瓶颈在于二维区域的朴素修改;考虑将二维区域修改转换为二维差分,同时计算前缀和

neweryyy的博客 93

洛谷 2484 [SDOI2011]打地鼠

【题解】   n^6的做法很好想,然而这样复杂度不对。。   然后我们可以发现R和C可以分开求,这样复杂度降到了n^4. 使用树状数组可以把复杂度降到n^3logn,可以顺利通过。    1 #include<cstdio> 2 #include<algorithm> 3 #define N 1010 4 #define rg regist...

weixin_30912051的博客 95

BZOJ2241&&P2484 [SDOI2011]打地鼠

大模拟! 枚举锤子的大小,并且一个必要条件是锤子的面积必须是地鼠总数的约数,不然肯定打不完 代码 //By AcerMo #include&lt;cmath&gt; #include&lt;cstdio&gt; #include&lt;cstring&gt; #include&lt;iostream&gt; #include&lt;algorithm&gt; using namespace...

AcerMoOi之路 514

[2019.3.8]BZOJ2241 [SDOI2011]打地鼠

如果我们确定了\(r\)和\(c\),事实上也确定了打地鼠的方案。 因为所有\(r\times c\)的矩形中,只有1个能覆盖当前还有地鼠的位置组成的图形的角落上的那个洞,所以我们只能在那个角落上砸。 比如,我们目前剩下的地鼠分布为 0 0 0 0 0 0 1 2 0 2 1 2 2 2 3 1 那么我们只能以第二行的第三个位置(那个加粗的1)为左上角砸1次。 做法1 于是我们可以\(O(nm)\...

weixin_34405332的博客 186

[BZOJ 2241][SDOI2011]打地鼠(枚举+预处理)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2241 分析: 鉴于R,C的取值很小,于是可以人为枚举R和C的大小,然后判定这个规格的锤子是否可以锤满棋盘并求出最少的次数 假设R*C的锤子可以锤满棋盘,那么便有了锤的方案:{A1,A2,……,An},易得任意交换这个锤的方案的顺序并没有影响,那么我们不妨把锤棋盘左上角的方案放在第...

weixin_30379911的博客 140

面向过程编程之打地鼠

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 打地鼠小游戏: 1、完成基本布局 2、随机出现小老鼠 1)随机出一个索引 2)根据索引取出td(网格),给td里加一张小老鼠的图片 3)setTimeout()让他隔断时间消失 注:setTimeout() 只执行 code 一次。如果要多次调用,请使用 setInterval() 或者让 code 自身再次调用 setTimeout()。 .

qq_37820215的博客 890

【SDOI 2011】打地鼠

Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。  游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉所有的地鼠。你认为这锤子太没用了,所以你改装了锤子,增加了锤子与地面的接触面积,使其每次可以击打一片区域。如果

Ciocio 1337

QT-Creator C/C++ 打地鼠小游戏

废话少说先上图: 这个游戏纯属土鳖思路,没有用到什么游戏引擎。 1.使用按钮或QLabel铺满窗口。 2.通过简单算法随机动态的设置按钮矩阵中某个按钮的背景图像。 3.同步2过程反复设置多个按钮背景实现图像动起来,注意调节刷新时间。 4.重写按钮组鼠标事件,设置鼠标移入时光标的图案,可以是个小锤子。 5.单击事件后鼠标同理切换鼠标图案打下和抬起。 6.加入一点声音。 7.没有了...

weixin_30776863的博客 625

BZOJ 2241([SDOI2011]打地鼠-二分判断+贪心)

Description 打地鼠是这样的一个游戏:地面上有一些地鼠洞,地鼠们会不时从洞里探出头来很短时间后又缩回洞中。玩家的目标是在地鼠伸出头时,用锤子砸其头部,砸到的地鼠越多分数也就越高。 游戏中的锤子每次只能打一只地鼠,如果多只地鼠同时探出头,玩家只能通过多次挥舞锤子的方式打掉所有的地鼠。你认为这锤子太没用了,所以你改装了锤子,增加了锤子与地面的接触面积,使其每次可以击打一片区域。如果我

nike0good |Oier&ACMer | 熟能生巧 2319
上一篇: P6533 RELATIVNOST 题解
if-OF
博客等级 码龄4年 1粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值