AcWing 3808. 画正方形

原题链接

Description

现在,我们要在平面上画出 n 个边长为 1 的正方形。

注意,这 n 个正方形之间允许存在公共边。

每个正方形的所有端点坐标都必须为整数,且所有边都必须平行于坐标轴。

我们将逐边绘制整个图形。

当绘制某一条边时,如果该边的两端端点为 (x,y) 和 (x,y+1),而我们在之前已经绘制了一条端点为 (x, y) 和 (x, y+1) 的边,则该边可以利用之前绘制的边作为参考,迅速画出。

同样的,如果即将绘制的边的两端端点为 (x, y) 和 (x+1, y),而我们在之前已经绘制了一条端点为 (x, y) 和 (x+1,y) 的边,则该边也可以利用之前绘制的边作为参考,迅速画出。

但是,如果即将绘制的边不满足上述条件,也就是不具备参考边,则为了保证绘图精确,我们需要借助尺子来绘制该条边。

例如,当 n=1 时,我们首先需要借助尺子绘制两条边,如下:

然后,借助以上两边完成剩余两边的绘制:

n=2 时,我们首先需要借助尺子绘制三条边,如下:

然后,借助以上三边完成剩余所有边的绘制:

我们希望在画出 n 个边长为 1 的小正方形的同时,借助尺子绘制的边的数量尽可能少。

请问,最少需要用尺子画多少条边。

Input

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含一个整数 n

Output

每组数据输出一行结果,表示需要用尺子绘制的最少边数。

Solution

使用最少的尺子,就是所需要行和列最少数, 也就是上图中红色部分最少数,设y为上行的数量,x为左列的数量,正方形数量z,要是x + y 最小, 很明显当 xy 接近的时候最小(重要不等式 a+b>2ab,当a==b时候取等号), 所以 x=z,y=zx 如果 xy==z,就直接返回x+y,否则,说明还有余数,需要再使用一次尺子,则返回x+y+1

Code

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int work(int n)
{
    int x = sqrt(n);
    int y = n / x;
    int r = n % x;
    if(r)
        return x + y + 1;
    else
        return x + y;
}
int main()
{
    int T;
    cin >> T;
    
    while (T --)
    {
        int n;
        cin >> n;
        
        cout << work(n) << endl;
    }
}
posted @   CharlesLC  阅读(133)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示