题解 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;
}
posted @ 2022-03-19 21:18  wbs200  阅读(65)  评论(0)    收藏  举报