题解 CF1099B Squares and Segments & AcWing.3808 画正方形
实际上,此题的题意为:画 \(n\) 个正方形,每一条边都是一个小木棍,但如果是同一行的所有竖边或同一列的所有横边只算画一次。求如果想要画 \(n\) 个正方形的话需要画多少次。
那么这个题显然是个思维题和枚举题。我们可以转化一下,看一下我们所画的所有正方形的边长是多少。设行数为 \(a\),列数为 \(b\),那么我们可以发现:同一行竖边需要画的一共有 \(a\) 组,需要画 \(a\) 次;同一列的横边一共有 \(b\) 组,需要画 \(b\) 次。所以我们可以发现,如果我们最终画出的这个矩阵是 \(a \times b\),那么我们就需要画 \(a+b\) 次。我们一共想要画 \(n\) 个矩阵,所以我们前提要求 \(a \times b \geq n\)。所以这个题就转化为了在保证 \(a \times b \geq n\) 的前提下求 \(a+b\) 的最小值。
这样的话我们可以使用均值不等式来解决。这里介绍另一种使用枚举的方法。我们对 \(a\) 进行枚举,则 \(b\) 的最小值为 \(\lceil \frac{n}{a} \rceil\)。这样就解决了这道题目。
#include <iostream>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
int n;
cin >> n;
int ans = n + 1;
for (int a = 1; a <= (n + a - 1) / a; a++) ans = min(ans, a + (n + a - 1) / a);
cout << ans << endl;
}
return 0;
}

浙公网安备 33010602011771号