POJ1840 Eqs ACM解题报告(打表+构造)

来源:互联网 发布:sql server 2000 网盘 编辑:程序博客网 时间:2024/05/18 01:27

这题乍一看我以为是水题,正准备5个for暴力的时候发现不对,貌似会TLE啊,于是就跪了,参考百度学习了一发哈希表,感觉也是极为精妙。特别是那个short的用法,第一次用short,也是赞

这题暴力会TLE,所以思路就是转化式子形式:


 

枚举左边出现的sum,然后枚举右边,这样大大的降低了复杂度,左边的sum需要打表记录,2*50^4=12500000,可能会出现负数所以得开25000000的数组,int会爆,所以要用short(ps.也是醉了,乍一看水题其实真难)

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;short hash[25000001];//2*50^4=25000000;int会爆内存,第一次用shortint main(){    int a1,a2,a3,a4,a5,x1,x2,x3,x4,x5,sum;    cin>>a1>>a2>>a3>>a4>>a5;    memset(hash,0,sizeof(hash));    for(x1=-50;x1<=50;x1++)    {        if(!x1) continue;        for(x2=-50;x2<=50;x2++)        {            if(!x2) continue;            sum=a1*x1*x1*x1+a2*x2*x2*x2;            if(sum<0) sum+=25000000;            hash[sum]++;//打表记录可以得到的和的次数。        }    }    int cnt=0;    for(x3=-50;x3<=50;x3++)    {        if(!x3) continue;        for(x4=-50;x4<=50;x4++)        {            if(!x4) continue;            for(x5=-50;x5<=50;x5++)            {                if(!x5) continue;                sum=a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5;                if(sum<-12500000) continue;//这个sum是上面的式子算不到的,要舍弃                if(sum<0&&sum>=-12500000) sum+=25000000;                cnt+=hash[sum];//这个sum有这些解            }        }    }    printf("%d\n",cnt);    return 0;}


0 0