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; }
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法