poj 1840

    

     直接循环肯定TLM。于是,分成左右两部分,前三个一个部分。分别算出他们的所有值,并存入hash[]数组中。hash数组要开50^5*2.因为可能存在求值是负的,但数组不能是负的,所以要开两倍,并且算出的结果要加上31250000再hash.  一开始我用二分查找。发现有点麻烦,而且也没hash快,下次用二分查找的时候,一定要优先考虑是不是可以用hash呢。二分查找的话要:50^3+50^2*log50^3.如果用hash的话:50^3+50^2。明显比二分查找要快。hash是个好东西啊!把查找变成线性的了!非常好。  我写的这个程序我跟别人的比较了下,都基本一样。但是多了memset()函数,完了,MLE。后来看了看AC的情况。50000+K memory啊,危险着呢。 还有就是要记得把数组开成short,不然肯定又MLE.

下面先发个经典的二分查找算法吧。纪念一下。

bool binary_search(int b[],int key)
{
    int low=0;
    int high=nCount-1;
    while(low<=high)
    {  
        int mid=(low+high)/2;
        int tem=b[mid];

        if(key<tem)
        {
            high=mid-1;
        }
        else if(key>tem)
        {
            low=mid+1;
        }
        else
        {
            return true;
        }
    }
    return false;
}

 

1840程序

#include <iostream>
//#include <fstream>

using namespace std;
#define MAX 31250000  
short hash[MAX*2+100];

int main()
{
    short i,j,k;
    int nCount=0;
    short a,b,c,d,e;
    freopen("acm.txt","r",stdin);
    //memset(hash,0,sizeof(hash));
    cin>>a>>b>>c>>d>>e;
    //先存储左边三个可能的所有值
        for(i=-50; i<=50; i++)
           for(j=-50; j<=50; j++)
              for(k=-50; k<=50; k++)
                 if(i!=0 && j!=0 && k!=0)
                 {
                        int ans=a*i*i*i+b*j*j*j+
                            c*k*k*k; 
                        hash[MAX+ans]++;   //有可能是负的!!
                 }

    for(i=-50; i<=50 ;i++)
        for(j=-50; j<=50; j++)
            if(i!=0 && j!=0)
            {
                int ans=-(d*i*i*i+e*j*j*j);
                nCount+=hash[MAX+ans];
            }
    cout<<nCount<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值