P2484 [SDOI2011]打地鼠 题解

数据仓库实践:从ITR流程讲指标体系建设 从 ITR 流程或者其他客服反馈流程的考核过程可见,实际工作中不可能只通过单个指标评价一个业务过程,需要从多个维度梳理业务,并把多个高度相关的指标组织起来,以避免只考虑其中某个指标从而摧毁整个业务过程的结果,指标体系=指标+体系。 阅读详情

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);
}
招标文件智能解析系统开发文档 本系统是一个基于OCR与大语言模型的招标文件智能解析平台,专门用于处理和分析招标文件,自动提取关键信息并进行结构化展示。 阅读详情

相关推荐

残差检验_第三十讲 R语言-Cox比例风险模型的假设检验条件

在介绍完 Cox比例风险模型的详细理论和R实现以后(插入链接!!!),我们已经知道Cox比例风险模型可以较好的同时矫正多个混杂因素对结果的影响,同时我们遗留下来了一个问题:Cox比例风险模型的假设检验条件是什么?这一讲,我们将对此进行解答。请注意,如果使用不当,统计模型可能会产生误导性的结论。因此,检查给定的模型是否适合数据类型是非常重要的!1. Cox比例风险模型的假设条件Cox比例风险模型的成...

weixin_35476698的博客 8047

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

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

cqbzfsk的博客 425

OpenRA引擎实战:如何从零开始搭建一个经典RTS游戏模组(附资源包)

本文详细介绍了如何利用开源游戏引擎OpenRA从零开始搭建经典RTS游戏模组。内容涵盖开发环境配置、资源管线处理、YAML规则定义、地图编辑与Lua脚本编写等全流程实战指南,并提供了资源包,帮助开发者和爱好者快速创建属于自己的即时战略游戏世界。

silver的专栏 903

c++ 入门oj1563打地鼠题解

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

weixin_44617853的博客 1749

【RK3588 NPU性能调优实战】多线程异步推理YOLOv5,榨干6TOPS算力

本文详细解析了如何在RK3588 NPU上通过多线程异步推理优化YOLOv5目标检测性能,实现6TOPS算力的最大化利用。通过线程池设计、流水线化帧处理及避开内存带宽瓶颈等技巧,将NPU利用率从30%提升至82%,帧率显著提高至61.2FPS。文章还提供了环境配置、代码实现及性能对比数据,助力开发者高效部署AI模型。

weixin_29034963的博客 340

面试题-手撕NMS(非极大值抑制)

非极大值抑制(Non-Maximum Suppression,NMS)是一种常用于目标检测和计算机视觉中的算法,用于去除重叠的边界框,保留最可能是真实目标的边界框。其核心就是对一组检测框,找出其中属于同一个类别且分数最高的那个框,然后把和这个框的IOU值大于阈值的那些框都删掉。

zhaoyqcsdn的博客 1108

【SDOI2011】打地鼠

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

OI技术宅 1274

域控制器开发避坑实录:从硬件设计到软件集成的5个关键挑战

本文深入剖析了域控制器开发中的5大关键挑战,从硬件选型到软件集成,涵盖智能驾驶芯片选择、实时性优化、AUTOSAR架构适配等核心问题。通过实战案例和数据对比,为工程师提供避坑指南,助力提升开发效率和系统可靠性。

weixin_29258297的博客 395

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

Windows 10/11蓝屏急救:SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION报错全攻略(附安全模式+CMD修复)

本文针对Windows 10/11系统常见的SECURE_PCI_CONFIG_SPACE_ACCESS_VIOLATION蓝屏报错,提供了从诊断到修复的完整解决方案。文章深入剖析了该错误与系统安全功能“内存完整性”及pci.sys驱动的关系,并详细指导用户如何通过安全模式进行基础修复,以及使用命令提示符执行高级系统文件修复和注册表修改,帮助用户彻底解决蓝屏问题并恢复系统稳定。

echo99的专栏 968

【深度学习】什么是自回归模型?

自回归模型是一种重要的时间序列模型,通过利用过去的值来预测当前或未来的值。它在统计学、经济学、自然语言处理等领域有广泛的应用。自回归模型的简单性和可解释性使其成为许多应用的首选,但在更复杂的情况下,可能需要结合其他模型如移动平均模型(MA模型)或混合模型(如ARIMA)来更好地捕捉时间序列中的模式。扩散模型(Diffusion Model)和自回归模型(Autoregressive Model)是两种不同的生成模型,各自有独特的特点和应用场景。

q742971636的博客 1670

2241: [SDOI2011]打地鼠

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

蒟蒻的Bzoj记录 634

PCL Super4PCS算法实现点云粗配准(版本一)【2025最新版】

Win11系统下实现[Super4PCS: Fast Global Pointcloud Registration via Smart Indexing一文中的配准算法。

点云侠的博客 3378

题解 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

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

洛谷 P2484 [SDOI2011]打地鼠

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

faojie的博客 908

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

P2484 [SDOI2011]打地鼠

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

weixin_30826095的博客 215

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【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、付费专栏及课程。

余额充值