巧克力(顺丰笔试题)

题目:巧克力
小丽明天要出去和同学春游。她准备带上总面积恰好为n 的巧克力板(简化起见将巧克力板视为平面图形,忽略它的厚度,只考虑面积)去和同学们一起分享。出于美感的考虑,小丽希望她带上的巧克力板都是边长为整教的正方形,另一方面出于便携性考虑,小丽希望这些巧克力板的周长之和尽可能小。请你帮小丽找出可 能的最小周长!换句话说,小丽需要你帮忙找出k个小正方形巧克力板,边长分别为a1,a2,...,ak,使得其面积之和,即1<=i<=kai2,恰好为要求的总面积为n;同时使得总周长,1<=i<=k4ai最小。

输入描述
一行,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;
}
posted @   lipu123  阅读(4)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2020-02-17 Coloring Colorfully
点击右上角即可分享
微信分享提示