zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    简述对vuex的理解
    Vuex总结--是什么?有什么?怎么用?
    Vuex总结
    在vue中,methods和computed这两个方法的区别。
    关于vuex
    生命周期的钩子函数
    vuex 的理解
    Linux 安装kubectl
    python装饰器
    MySQL事务
  • 原文地址:https://www.cnblogs.com/arknight/p/13073140.html
Copyright © 2011-2022 走看看