POJ 1840 (哈希)

思路一、排序 暴力

//a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0

//拆成a3x33+ a4x43+ a5x53 = -a1x1 3+ a2x2 3

#include <stdio.h>

#include <stdlib.h>

 

int cmp(const void *a, const void *b)

{

       return *(int *)a - *(int *)b;

}

int num[6], cube[101], sum1[10001], sum2[1000001];

 

int main()

{

       int i, j, k;

    int a, b;

       int count;

 

       for(i=0; i<5; i++)

              scanf("%d", &num[i]);

      

       k=0;

       for(i=-50; i<=50; i++)

       {

              if(i!=0)

                     cube[k ++]=i*i*i;

       }

      

       a=0; b=0;

       for(i=0; i<100; i++)

              for(j=0; j<100; j++)

                     sum1[a++]= -(cube[i]*num[0]+cube[j]*num[1]);

      

       for(i=0; i<100; i++)

              for(j=0; j<100; j++)

                     for(k=0; k<100; k++)

                            sum2[b++]= cube[i]*num[2]+cube[j]*num[3]+cube[k]*num[4];

      

       qsort(sum1, a, sizeof(sum1[0]), cmp);

       qsort(sum2, b, sizeof(sum2[0]), cmp);

      

       i=0; j=0; count=0;

       while(i<a && j<b)

       {

              if(sum1[i]<sum2[j])

                     i ++;

              else if(sum1[i]>sum2[j])

                     j ++;

              else //有可能有相同的值,要注意!

              {

                     k=i;

                     while(sum1[k]==sum2[j])

                     {

                            count ++;

                            k ++;

                     }

                     j ++;

              }

       }

 

       printf("%d/n", count);  

       return 0;

}

思路二、哈希查找 尚待深入研究

#include <stdio.h>

#define n 12500000

/*必须用char型!,否则会mle,因为char以一个字节存放一个字符,

存放的是该字符相应的ASCII. int  VC++ 4个字节, Turbo C 2.0

TURBO c++ 3.0 2个字节 范围0-255

*/

char hash[n*2];

 

int main()

{

       int i, j, k;

       int count, temp;

       int num[6], cube[101];

 

       k=0;

       for(i=-50; i<=50; i++)

       {

              if(i!=0)

                     cube[k ++]=i*i*i;

       }

 

       for(i=0; i<5; i++)

              scanf("%d", &num[i]);

      

       for(i=0; i<100; i++)

              for(j=0; j<100; j++)

              {

                     temp= -(cube[i]*num[0]+cube[j]*num[1]);

                     hash[temp+n] ++;

              }

 

       count=0;

       for(i=0; i<100; i++)

              for(j=0; j<100; j++)

                     for(k=0; k<100; k++)

                     {

                            temp = cube[i]*num[2]+cube[j]*num[3]+cube[k]*num[4];

                            if(temp>=-n && temp<=n)

                                   count += hash[temp+n];  //为什么能这样加?

                     }

 

       printf("%d/n", count);  

       return 0;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值