Codeforces1029F. Multicolored Markers

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/wys5wys/article/details/82832053