1 条题解

  • 0
    @ 2025-8-24 22:21:13

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Xeqwq
    AFOed

    搬运于2025-08-24 22:21:13,当前版本为作者最后更新于2020-04-27 09:09:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这道题啊,主要就是用数学分析。
    我们可以得到n+mn+mnmn*m,然后用for循环解方程好像原本是能解的但是有点麻烦。
    要得到n+mn+m,我们可以通过分析最外面的一圈,也就是r:n+m=1/2r+2n+m=1/2r+2
    这个公式我们可以理解成把外面的一圈分成全等的两个部分然后来补位。
    图1
    图中外面那一圈像这样分成了全等的两半,这5格的面积可以对应1A的左边(上边也行)、2A的左边、3A的左边、1B的上边和1C的上边,差1A的上边(或者左边)和1D的上边就可以凑成整个图形的周长的一半,一共要补两个单位的边。
    至于nmn*m嘛,那很好算。nmn*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;
    	}
    }
    

    谢谢大家~

    • 1

    信息

    ID
    5465
    时间
    1000ms
    内存
    32MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者