AcWing 3808. 画正方形
Description
现在,我们要在平面上画出 个边长为 1 的正方形。
注意,这 个正方形之间允许存在公共边。
每个正方形的所有端点坐标都必须为整数,且所有边都必须平行于坐标轴。
我们将逐边绘制整个图形。
当绘制某一条边时,如果该边的两端端点为 (,) 和 (,+1),而我们在之前已经绘制了一条端点为 (, ) 和 (, +1) 的边,则该边可以利用之前绘制的边作为参考,迅速画出。
同样的,如果即将绘制的边的两端端点为 (, ) 和 (+1, ),而我们在之前已经绘制了一条端点为 (, ) 和 (+1,) 的边,则该边也可以利用之前绘制的边作为参考,迅速画出。
但是,如果即将绘制的边不满足上述条件,也就是不具备参考边,则为了保证绘图精确,我们需要借助尺子来绘制该条边。
例如,当 时,我们首先需要借助尺子绘制两条边,如下:
然后,借助以上两边完成剩余两边的绘制:
当 时,我们首先需要借助尺子绘制三条边,如下:
然后,借助以上三边完成剩余所有边的绘制:
我们希望在画出 个边长为 1 的小正方形的同时,借助尺子绘制的边的数量尽可能少。
请问,最少需要用尺子画多少条边。
Input
第一行包含整数 ,表示共有 组测试数据。
每组数据占一行,包含一个整数 。
Output
每组数据输出一行结果,表示需要用尺子绘制的最少边数。
Solution
使用最少的尺子,就是所需要行和列最少数, 也就是上图中红色部分最少数,设为上行的数量,为左列的数量,正方形数量,要是 + 最小, 很明显当 和 接近的时候最小(重要不等式 ,当时候取等号), 所以 如果 ,就直接返回,否则,说明还有余数,需要再使用一次尺子,则返回
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;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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训练数据并当服务器共享给他人