• POJ 1840 HASH


    题目链接:http://poj.org/problem?id=1840

    题意:公式a1x1^3+ a2x2^3+ a3x3^3+ a4x4^3+ a5x5^3=0,现在给定a1~a5,求有多少个(x1~x5)的组合使得公式成立。并且(x1~x5)取值再[-50,50]且不能为0

    思路:因为x的值范围比较小,只有100.所以可以先求出 a1x1^3+a2x2^3+a3x3^3. 然后在求 (-1)*(a4x4^3+a5x5^3)从前面的所得的Hash表进行二分查找。

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<time.h>
    #include<map>
    using namespace std;
    typedef long long int LL;
    const int MAXN=1000000+5;//100^3
    int a,b,c,d,e;
    int Hash[MAXN];
    int main(){
    #ifdef kirito
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
        int start=clock();
        while(~scanf("%d%d%d%d%d",&a,&b,&c,&d,&e)){
            int cnt=0,ans=0;
            for(int i=-50;i<=50;i++){ //make a1x1^3+a2x2^3+a3x3^3
                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;}
                        int Sum=a*i*i*i+b*j*j*j+c*k*k*k;
                        Hash[cnt++]=Sum;
                    }
                }
            }
            sort(Hash,Hash+cnt); //sorted
            for(int i=-50;i<=50;i++){ //make  (-1)*(a4x4^3+a5x5^3)
                if(i==0){continue;};
                for(int j=-50;j<=50;j++){
                    if(j==0){continue;}
                    int Sum=(-1)*(d*i*i*i+e*j*j*j);//the search number
                    for(int k=lower_bound(Hash,Hash+cnt,Sum)-Hash;k<cnt;k++){//binary search the number
                        if(Hash[k]!=Sum){
                            break;
                        }
                        else{
                            ans++; 
                        }
                    }
                }
            }
            printf("%d
    ",ans);
        }
    #ifdef LOCAL_TIME
        cout << "[Finished in " << clock() - start << " ms]" << endl;
    #endif
        return 0;
    }
  • 相关阅读:
    volley框架使用
    Insert Interval
    candy(贪心)
    Best Time to Buy and Sell Stock
    Best Time to Buy and Sell Stock III
    distinct subsequences
    edit distance(编辑距离,两个字符串之间相似性的问题)
    trapping rain water
    word break II(单词切分)
    sudoku solver(数独)
  • 原文地址:https://www.cnblogs.com/kirito520/p/5659468.html
Copyright © 2020-2023  润新知