题目链接:http://codeforces.com/problemset/problem/1029/F
题意:给出a块红砖,b块蓝砖,现在用这些转拼矩形,要求两种颜色形成大矩形的同时,其中至少一种颜色的砖块也要形成矩形,问:他们所形成的所有矩形中,最小周长是多少。
个人思路:现在我们总共有c = a+b块砖,而如果我们要得到最小周长C,我们就要使砖块形成的矩形尽量向正方形靠拢。在此之前我们先记录一个最小长度x=c,即可行的最大周长矩形长,我们如果对长搜索,则其范围i应是1到sqrt(a+b)取下整,同理,在其搜索过程中我们判断:a%i==0&&sqrt(a)>=i或者b%i==0&&sqrt(b)>=i,如果是的话,我们将x更新,然后再保留符合要求中的最小周长的那个就行了。
代码:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main()
{
ll a,b,c;
cin>>a>>b;
c = a+b;
int sa = sqrt(a);
int sb = sqrt(b);
int sc = sqrt(c);
ll x = c,C = 0;
for(int i = 1; i <= sc; i++)
{
if(a%i==0&&sa>=i)x = min(x,a/i);
if(b%i==0&&sb>=i)x = min(x,b/i);
if(c%i==0)
{
ll j = c/i;
if(j>=x)C = 2*(i+j);
}
}
cout<<C;
return 0;
}