• hdoj:2058


     
    #include <iostream>
    #include <cmath>
    #include <vector>
    using namespace std;
    
    struct node{
        int left;
        int right;
    };
    int main()
    {
        long  N, M;
        long long sum = 0;
        vector<node> nodes;
        while (cin >> N >> M)
        {
            if (N == 0 && M == 0)
                break;
    
            for (long n = N; n >=1; n--)
            {
                if ((2*M-n*n+n)%(2*n)!=0)
                    continue;
                long long a1 = (2 * M - n*n + n) / (2 * n);
                
                long long an = a1 + n - 1;
                if (a1 >= 1 && a1 <= N && an >= 1 && an <= N && a1 <= an)
                {
                    //node node;
                    //node.left = a1;
                    //node.right = an;
                    //nodes.push_back(node);
                    cout << "[" << a1 << "," << an << "]" << endl;
                }
            }
            //for (node node : nodes)
            //{
            //    cout << "[" << node.left << "," << node.right << "]" << endl;
            //}
            cout << endl;
        }
        return 0;
    }

    超时

    a1 = k

    an = k + n - 1

    M = n*(2k+n-1)/2

    解的

    k = M/n - (n-1)/2,这个不能这样写,要写在一起

    (2M-n*n-n)/(2*n)。否则对于30/4 - 3/2,会忽略这样的结果,如果先通分当然也就可以。

     超时

    利用a1>=1这个条件可以减少循环次数

    2M - n*n >n

    2M > n*n - n>n*n

    sqrt(2M)>n

    #include <iostream>
    #include <cmath>
    #include <vector>
    using namespace std;
    
    struct node{
        int left;
        int right;
    };
    int main()
    {
        long  N, M;
        long long sum = 0;
        vector<node> nodes;
        while (cin >> N >> M)
        {
            if (N == 0 && M == 0)
                break;
    
            for (long n = sqrt(2*M); n >=1; n--)
            {
                if ((2*M-n*n+n)%(2*n)!=0)
                    continue;
                long a1 = (2 * M - n*n + n) / (2 * n);
                
                long an = a1 + n - 1;
                if (a1 >= 1 && a1 <= N && an >= 1 && an <= N && a1 <= an)
                {
                    //node node;
                    //node.left = a1;
                    //node.right = an;
                    //nodes.push_back(node);
                    cout << "[" << a1 << "," << an << "]" << endl;
                }
            }
            //for (node node : nodes)
            //{
            //    cout << "[" << node.left << "," << node.right << "]" << endl;
            //}
            cout << endl;
        }
        return 0;
    }
  • 相关阅读:
    搜索旋转排序数组
    SpringBoot整合mybatis
    《浪潮之巅》阅读笔记01
    阅读杂记01
    go home or stand up
    关于URL编码/javascript/js url 编码(轉)
    水晶报表 相关。
    Format函数(转)
    asp 亂碼問題。
    圣人不死,大盗不止
  • 原文地址:https://www.cnblogs.com/theskulls/p/6048403.html
Copyright © 2020-2023  润新知