巧克力(顺丰笔试题)
题目:巧克力
小丽明天要出去和同学春游。她准备带上总面积恰好为n 的巧克力板(简化起见将巧克力板视为平面图形,忽略它的厚度,只考虑面积)去和同学们一起分享。出于美感的考虑,小丽希望她带上的巧克力板都是边长为整教的正方形,另一方面出于便携性考虑,小丽希望这些巧克力板的周长之和尽可能小。请你帮小丽找出可 能的最小周长!换句话说,小丽需要你帮忙找出k个小正方形巧克力板,边长分别为,使得其面积之和,即,恰好为要求的总面积为n;同时使得总周长,最小。
输入描述
一行,1个整数n,表示小丽希望带上的巧克力板总面积。
1<=n<=50000
输出描述
输出一行一个整数表示可能的最小周长
样例输入
11
样例输出
20
说明
我们带上三块边长分别为3、1、1的正方形巧克力板,总面积为32+12+1^2=11,此时周长为4*(3+1+1)=20。可以证明没有周长更小的方案。
这是一个典型的动态规划问题,我们的目标是将总面积 n 分解成若干个边长为整数的正方形,使得这些正方形的周长之和最小。
思路分析
我们可以使用动态规划来解决这个问题。设 dp[i] 表示总面积为 i 时的最小周长。对于每个总面积 i,我们尝试所有可能的正方形边长 j(1 <= j * j <= i),更新 dp[i] 的值。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+100;
int n;
int a[maxn];//面积为i的最大值
int main(){
int n;
cin>>n;
memset(a,0x3f3f3f3f,sizeof(a));
a[0]=0;
for(int i=1;i<=n;i++){
for(int j=i*i;j<=n;j++){
a[j]=min(a[j],a[j-i*i]+4*i);
}
}
cout<<a[n]<<endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2020-02-17 Coloring Colorfully