CodeForces - 1029F(思维)

题目链接

题意:

有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;
}

猜你喜欢

转载自blog.csdn.net/ACkingdom/article/details/105802884