洛谷原题

题目说的很清楚了。让我们在 \(N \times M\) 的矩阵中放置炮塔,让每一个 \(K \times K\) 的正方形里都有至少 \(1\) 个炮塔。求最少放置炮塔数量。


8 分做法

不难发现,子任务 1 有个特殊性质,即 \(K = 1\)。因为每个格子都是 \(1 \times 1\) 的正方形,所以,这表示,每一个格子都要有炮塔。
答案:\(N \times M\)


AC 做法

分析一下样例图片,可以发现,想让答案最小,那么要尽量做到每个 \(K \times K\) 的正方形中都有 \(1\) 个炮塔。


此处仅列举部分,敬请谅解。

结合上图,容易发现,想让每个 \(K \times K\) 的正方形里都尽量有 \(1\) 个炮塔。那么每两个同一行炮塔的距离尽量要是 \(K - 1\)

![]( https://cdn.luogu.com.cn/upload/image_hosting/w010zocx.png?x-oss-process=image/resize ,m_lfit,h_200)
这一张图也满足这个规律。
也就是说,如果要在这一行放炮塔,要放 \(\left\lfloor\dfrac{N}{K}\right\rfloor\) 个。为什么是除以 \(K\) 呢?因为还要加上放置炮塔的一个格子,\(K - 1 + 1 = K\),所以除以 \(K\) 就行了。至于向下取整,是因为其它剩下的格子距离最近的炮塔一定不足 \(K\) 格,所以它们会在同一个 \(K \times K\) 的正方形中。

对于列,也是一样的,如果要在这一列放炮塔,就要放 \(\left\lfloor\dfrac{M}{K}\right\rfloor\) 个。

所以,答案是 \(\left\lfloor\dfrac{N}{K}\right\rfloor \times \left\lfloor\dfrac{M}{K}\right\rfloor\)


AC 记录

AC 代码

#include<bits/stdc++.h>
using namespace std;
int solve(int N,int M,int K){
    return (N/K)*(M/K);
}
posted on 2026-06-29 21:37  lz5332t  阅读(2)  评论(0)    收藏  举报