题解 P6483 【[COCI2010-2011#4] PARKET】

· · 题解

这道题啊,主要就是用数学分析。
我们可以得到n+mn*m,然后用for循环解方程好像原本是能解的但是有点麻烦。
要得到n+m,我们可以通过分析最外面的一圈,也就是r:n+m=1/2r+2
这个公式我们可以理解成把外面的一圈分成全等的两个部分然后来补位。

图中外面那一圈像这样分成了全等的两半,这5格的面积可以对应1A的左边(上边也行)、2A的左边、3A的左边、1B的上边和1C的上边,差1A的上边(或者左边)和1D的上边就可以凑成整个图形的周长的一半,一共要补两个单位的边。
至于n*m嘛,那很好算。n*m也就是整个图形的面积,也就是r+b。

int r,b;
cin>>r>>b;
int c=r/2+2;
int area=r+b;

之后,就可以枚举m、n,得到这两个数。

for(int i=c-1;i>0;i--)//i是n,(c-i)是m
{
    if((c-i)*i==area)//如果n*m=面积
    {
        cout<<i<<" "<<c-i;那就输出n和m,按照枚举的顺序可以知道这组就是n的最大值。
        break;
    }
}

谢谢大家~