• [蓝桥杯][2016年第七届真题]四平方和


    暴力做法

    时间复杂度:(O(n^3))

    int n;
    
    int main()
    {
        cin>>n;
    
        for(int i=0;i*i<=n;i++)
            for(int j=i;i*i+j*j<=n;j++)
                for(int k=j;i*i+j*j+k*k<=n;k++)
                {
                    int t=n-i*i-j*j-k*k;
                    int d=sqrt(t);
                    if(d*d == t) 
                    {
                        cout<<i<<' '<<j<<' '<<k<<' '<<d<<endl;
                        return 0;
                    }
                }
    
        //system("pause");
        return 0;
    }
    

    二分做法

    枚举(c)(d),将(c^2+d^2)存至数组中,再枚举(a)(b),查找(n-a^2-b^2)是否在数组中出现过。时间复杂度:(O(n^2log{n^2})))

    const int N=5e6+10;
    struct Node
    {
        int c,d,sum;
        Node(){}
        Node(int _c,int _d,int _sum):c(_c),d(_d),sum(_sum){}
        bool operator<(const Node &W) const
        {
            if(sum != W.sum) return sum < W.sum;
            if(c != W.c) return c < W.c;
            return d < W.d;
        }
    }cd[N];
    int n;
    int cnt;
    
    int main()
    {
        cin>>n;
    
        //枚举c^2+d^2
        for(int i=0;i*i<=n;i++)
            for(int j=i;i*i+j*j<=n;j++)
            {
                int sum=i*i+j*j;
                cd[cnt++]={i,j,sum};
            }
    
        sort(cd,cd+cnt);
        
        bool ok=false;
        //枚举a^2+b^2
        for(int i=0;i*i<=n;i++)
        {
            for(int j=i;i*i+j*j<=n;j++)
            {
                int t=n-i*i-j*j;
                int pos=lower_bound(cd,cd+cnt,Node(0,0,t))-cd;
                if(pos != cnt && cd[pos].sum == t)
                {
                    cout<<i<<' '<<j<<' '<<cd[pos].c<<' '<<cd[pos].d<<' '<<endl;
                    ok=true;
                    break;
                }
            }
            if(ok) break;
        }
    
        //system("pause");
        return 0;
    }
    

    哈希表

    时间复杂度:(O(n^2)),但(unordered\_map)常数较大。

    unordered_map<int,PII> mp;
    int n;
    
    int main()
    {
        cin>>n;
    
        //枚举c^2+d^2
        for(int i=0;i*i<=n;i++)
            for(int j=i;i*i+j*j<=n;j++)
            {
                int sum=i*i+j*j;
                if(mp.count(sum) == 0) mp[sum]={i,j};
            }
        
        //枚举a^2+b^2
        for(int i=0;i*i<=n;i++)
        {
            for(int j=i;i*i+j*j<=n;j++)
            {
                int t=n-i*i-j*j;
                if(mp.count(t))
                {
                    cout<<i<<' '<<j<<' '<<mp[t].fi<<' '<<mp[t].se<<endl;
                    return 0;
                }
            }
        }
    
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    BZOJ2752: [HAOI2012]高速公路(road)
    BZOJ1146: [CTSC2008]网络管理Network
    BZOJ3545: [ONTAK2010]Peaks
    启发式算法
    特征选择算法
    傅里叶变换 小波变换
    流类库 输入输出
    模板与异常处理
    多态性
    派生类与继承
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14555804.html
Copyright © 2020-2023  润新知