zoukankan      html  css  js  c++  java
  • Hash

    hash的应用包括两种,一种是整数方面一种是字符串方面。

    整数:

    hdu1425:

    水题,考虑将所有数据存到对应的hash数组,然后倒叙查找输出即可。考虑负数处理方式。

    #include<bits/stdc++.h>
    using namespace std;
    int h[1000005];
    //直接将数据存hash[i]对应的位置即可
    int main(){
        int m,n,k;
        while(scanf("%d%d",&m,&n)!=EOF){
        memset(h,0,sizeof(h));
        for(int i=0;i<m;i++){
            scanf("%d",&k);
            h[k+500000]=1;
        }
        int num=1;
        for(int i=1000004;i>=0;i--){
            if(h[i]==0)continue;
            if(h[i]==1){
                if(num<n) cout<<i-500000<<" ";
                if(num==n) {
                        cout<<i-500000<<endl;
                        break;
                }
                num++;
            }
        }
        }
    return 0;
    }
    hdu1425

    hdu1496:

    思路巧妙,考虑如果使用暴力,那么就要四层循环耗时很大,可以考虑计算a*i^2+b*j^2 和c*i^2+d*j^2 分别计算,最后判断是否和为0即可。

    这里hash算法的用处是将第一部分计算的值存放到hash数组里,第二部计算结果直接查找hash中是否与其和为0的数即可。

    这样算法的复杂度及改为2*n^2

    需要注意的是:a,b,c,d不能全为正数或负数。参数正负情况结果相同,故有2^4种

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    //计算a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
    int pos[1000005];//正数结果存放位置
    int neg[1000005];//负数结果存放位置
    int main(){
        int a,b,c,d;
        while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){
            if(a>0&&b>0&&c>0&&d>0||a<0&&b<0&&c<0&&d<0){
                cout<<"0"<<endl;
                continue;
            }
            memset(pos,0,sizeof(pos));
            memset(neg,0,sizeof(neg));
            for(int i=1;i<=100;i++){
                for(int j=1;j<=100;j++){
                    int num=a*i*i+b*j*j;
                    if(num>=0)pos[num]++;
                    else neg[-num]++;
                }
            }
            int sum=0;
            for(int i=1;i<=100;i++){
                for(int j=1;j<=100;j++){
                    int num=c*i*i+d*j*j;
                    if(num<=0)sum+=pos[-num];
                    else sum+=neg[num];
                }
            }
            cout<<sum*16<<endl;//4个参数正负情况结果相同故有2^4种
        }
    return 0;
    }
    hdu1496

    字符串: 

    hdu1228

    题目很容易,只要将英文转为数字即可。难点在于如何输入,所以我们可以把+和=号作为标识符。

    #include<cstdio>
    #include<iostream>
    #include<map>
    #include<string>
    using namespace std;
    /*
        重点如何输入
    */
    map<string,int> ma;
    int main(){
        ma["zero"]=0;
        ma["one"]=1;
        ma["two"]=2;
        ma["three"]=3;
        ma["four"]=4;
        ma["five"]=5;
        ma["six"]=6;
        ma["seven"]=7;
        ma["eight"]=8;
        ma["nine"]=9;
        int num=0;
        string in;
        while(1){
                int a=0;
            while(cin>>in){
                if(in=="+")break;
                a=a*10+ma[in];
            }
            int b=0;
            while(cin>>in){
                    if(in=="=")break;
                b=b*10+ma[in];
            }
            int sum=a+b;
            if(sum==0)break;
            cout<<a+b<<endl;
        }
    return 0;
    }
    hdu1228
  • 相关阅读:
    关于在php+apache开发过程中使用svn进行版本的维护
    Fragment的切换动画实现
    IOS MJExtension json转模型的轻量级框架的使用
    Centos 配置Red5流媒体服务器
    在Centos 6.5 上面配置 SVN
    在Centos 上面配置Openfire
    关于阿里云上面的Centos上面配置 防火墙
    【Android 一些难以理解的控件、容易混淆的、多种实现方式的、一些该纠正的想法】
    【进攻移动开发_htm5_跨平台_的号角】
    【进攻Android的号角】
  • 原文地址:https://www.cnblogs.com/Yvettey-me/p/6714665.html
Copyright © 2011-2022 走看看