poj 1840 简单hash。

poj 1840 简单hash。

与其说是hash,我倒觉得这只是函数映射的思想而已。

//return a[0]*pow(double(x1),double(3))+a[1]*pow(double(x2),double(3))+a[2]*pow(double(x3),double(3));
	return a[0]*x1*x1*x1+a[1]*x2*x2*x2+a[2]*x3*x3*x3;
对于这行。。之前用的是注释掉的那行的时候。。Time:4000+MS,一改就降了一个数量级。。。。。。。。

Source Code

Problem: 1840 User: 64162451
Memory: 53824K Time: 469MS
Language: C++ Result: Accepted
  • Source Code
  • #include<iostream>
    #include<fstream>
    #include<map>
    #include<math.h>
    using namespace std;
    const int prime=39999991;
    const int   Max=18750000;
    map<int,int> map1;
    short int Hash[prime];
    int a[5];
    
    int f(int x1,int x2,int x3)
    {
    	//return a[0]*pow(double(x1),double(3))+a[1]*pow(double(x2),double(3))+a[2]*pow(double(x3),double(3));
    	return a[0]*x1*x1*x1+a[1]*x2*x2*x2+a[2]*x3*x3*x3;
    }
    int g(int x4,int x5)
    {
    	//return -(a[3]*pow(double(x4),double(3))+a[4]*pow(double(x5),double(3)));
    	return a[3]*x4*x4*x4+a[4]*x5*x5*x5;
    }
    int main()
    {
    	//fstream cin("C:\\Users\\wuyanyisb\\Desktop\\1.txt");
    	for(int i=0;i<5;i++)
    		cin>>a[i];
    	for(int i=-50;i<=50;i++)
    	{
    		if(i==0)continue;
    		for(int j=-50;j<=50;j++)
    		{
    			if(j==0)continue;
    			int t=g(i,j);
    			Hash[t+Max]++;
    		}
    	}
    	int ans=0;
    	for(int i=-50;i<=50;i++)
    	{
    		if(i==0)continue;
    		for(int j=-50;j<=50;j++)
    		{
    			if(j==0)continue;
    			for(int k=-50;k<=50;k++)
    			{
    				if(k==0)continue;
    				ans+=Hash[f(i,j,k)+Max];
    			}
    		}
    	}
    	cout<<ans<<endl;
    	system("pause");
    	return 0;
    }
posted on 2011-07-10 19:38  不是我干的  阅读(136)  评论(0)    收藏  举报