20200608递归测试 T2 地盘划分 题解

题目

 

分析

递归分析

首先,看到这个题,我们可以先从样例入手分析。看样例,容易发现每次剩下的长方形的宽就是上次长方形的长减宽,长就是上一个长方形的宽。(如果宽比长大,换一下顺序就可以了)

那我们就容易想到这道题可以用递归来解决。每次传入剩下的长方形的长和宽就行了。

直到长和宽有一个是零就可以了。

到这里,我们就可以写出递归的代码了。

递归代码

#pragma GCC optimize(3)
#include<bits/stdc++.h>

using namespace std;

unsigned int totX,totY;
unsigned int RESULT;

void clac(unsigned int x,unsigned int y)
{
    if(x<y)//如果长比宽小,那就交换顺序,否则会出现负数 
    {
        swap(x,y);
    }
    if(x==0||y==0)
    {
        return;
    }
    if(x==1)
    {
        RESULT+=y;
        return;
    }
    if(y==1)
    {
        RESULT+=x;
        return;
    }
    //优化,如果长和宽有一个是一且都不是零,则还能分成的小正方形个数一定就是另一边的长度 
    RESULT++;
    clac(y,x-y);
}

int main()
{
    freopen("territory.in","r",stdin);
    freopen("territory.out","w",stdout);
    cin>>totX>>totY;
    clac(totX,totY);
    cout<<RESULT<<endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

问题&解决方案

这么有理有据的递归代码,竟然会运行错误!!

 

测试点输入文件测试结果运行用时内存消耗得分
#1 territory1.in 答案正确 0.000 s 2.543 MB 10
#2 territory2.in 答案正确 0.000 s 2.543 MB 10
#3 territory3.in 答案正确 0.000 s 2.535 MB 10
#4 territory4.in 答案正确 0.000 s 2.539 MB 10
#5 territory5.in 答案正确 0.000 s 2.535 MB 10
#6 territory6.in 答案正确 0.000 s 2.539 MB 10
#7 territory7.in 答案正确 0.000 s 2.539 MB 10
#8 territory8.in 运行时错误 不可用 不可用 0
#9 territory9.in 答案正确 0.000 s 3.547 MB 10
#10 territory10.in 答案正确 0.000 s 2.566 MB 10

康康测试点8的数据:

2 10000000

!!!!!

这么大的数据,结合上面的“运行错误”,明显这是爆栈了。

看来这个题不能使用递归。(那为什么还是递归测试[doge])

明显只能使用循环了。

也很好写,只需要把刚才传入长和宽改为把长和宽存储在变量中,每次直接调用就可以了。

终极代码

#pragma GCC optimize(3)
#include<bits/stdc++.h>

using namespace std;

int n,m,ans;

int main()
{
    freopen("territory.in","r",stdin);
    freopen("territory.out","w",stdout);
    cin>>n>>m;
    while(n&&m)
    {
        ans++;
        if(n==m)
        {
            cout<<ans<<endl;
            return 0;
        }
        if(n>m)
        {
            n-=m;
        }
        else
        {
            m-=n;
        }
    }
    return 0;
}

 

posted @ 2020-06-09 16:05  芊枫Thomitics  阅读(266)  评论(0编辑  收藏  举报