zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    内联元素间的间隔
    事件处理程序DOM0,DOM2,IE的区别总结
    open live writer下载安装
    sublime3下载安装及常用插件、浏览器预览设置
    常用的清除浮动的方法
    input中的name,value以及label中的for
    利用fiddler将本地网页放到某个域下
    Date类型常用概念及方法总结(1)
    构建之法 第六章 敏捷流程
    javascript 入门之 新窗口打开网站
  • 原文地址:https://www.cnblogs.com/bbbblog/p/6048403.html
Copyright © 2011-2022 走看看