一个矩形的面积为S,已知该矩形的边长都是整数,求所有满足条件的矩形中,周长的最小值。例如:S = 24,那么有{1 24} {2 12} {3 8} {4 6}这4种矩形,其中{4 6}的周长最小,为20。
Input
输入1个数S(1 <= S <= 10^9)。
Output
输出最小周长。
Sample Input
24
Sample Output
20
这道题刚开始憨憨的没管时间用两个for去干被爆TLE,但后来发现是高中学的一个均值不等式,给定一个面积去求周长的最小值,可以用ab≤(a+b)2/4,用这个不等式当a=b的时候等号成立,所以当测试数据不是完全平方数的时候就应该是a,b最接近的时候取得周长的最小值,所以可以将长从面积的大小开始使用宽=面积/长,来算,一旦宽≥长的时候就是我需要的最小周长,此时即可break,结束循环
代码
#include<iostream>
using namespace std;
int main()
{
int s;
cin>>s;
int a,b;//长为a,宽为b
for(b=1;b<s;b++)//宽度从1开始递增
{
a=s/b;
if(s==a*b&&b>=a)//此处需要特判,不然如果s/b是浮点型,给a就会使整型而出错
{
break;
}
}
cout<<2*(a+b)<<endl;
return 0;
}