题目链接
题意:
有a块红砖和b块蓝砖,将他们拼成一个矩形区域(全部使用)的同时满足红蓝两色的其中一个区域(实心且相连)也能够拼成一块矩形,求这个矩形的最小周长。
思路:
一道纯思维题,有一说一,其实有时候挺喜欢做这种不太需要算法的题 ,首先我们都知道当面积一定时,矩形越接近正方形周长越短,所以我们开方后从大到小开始遍历,每当我们找到一个因子就判断a块或b块砖能否在这个矩形内再拼成一块矩形,ab任意一个满足条件就跳出循环并输出(中间穿插小优化:当判断的小矩形的长或宽超过大矩形的长或宽时就停止,其实不加也不会T(小声bb) )。
代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,n,ans=0;
cin>>a>>b;
n=a+b;
for(int i=sqrt(a+b);i>=1;i--)
{
if(n%i==0)
{
for(int j=i;j>=1;j--)
{
if((a%j==0&&(a/j)<=(n/i))||(b%j==0&&(b/j)<=(n/i)))
{
ans=i;
break;
}
if((a/j)>(n/i)&&(b/j)>(n/i))
break;
}
}
if(ans!=0)
break;
}
cout<<ans*2+(n/ans)*2<<endl;
return 0;
}