Hash入门第一题

题意:

  1. 问题描述

  • 考虑具有以下形式的方程:

  • a * x1 ^ 2 + b * x2 ^ 2 + c * x3 ^ 2 + d * x4 ^ 2 = 0

  • a,b,c,d是来自区间[-50,50]的整数和它们中的任何不能为0。

  • 这是考虑的溶液的系统(X1,X2,X3,X4),其验证方程,xi是从[-100,100]和XI的整数!= 0,任意i∈{1, 2,3,4}。

  • 确定满足给定方程的解决方案数量。

输入

输入包含几个测试用例。每个测试用例由包含4个系数a,b,c,d的单行组成,由一个或多个空格分隔。

文件结束。

产量

对于每个测试用例,输出包含解决方案数量的单行。

样本输入
1 2 3 -4

1 1 1 1

样本输出
39088

0

题目分析:

        最开始的想法会是从0-100里面找x1,x2,x3,x4, 4个任意不同组合,会用4重循环,然后用得到的值×16

  • 如果用Hash的思路的话

  • 1.用内存换时间

  • 2.只需要两重循环,+Hash存储查找就行了。

  • 3.将4重循环分解为两个两重循环

  • 4.查找满足条件的记录下来

#include <stdio.h>
#include <memory.h> int pin[101];//用来记录x(i)^2的值
int hash[2000003];//hash表的key值 int main(){
int a, b, c, d;
int sum;
//pin 用来存储每个x(i)的可能值
for( int i = 1; i <= 100; i++ )
pin[i] = i * i;
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)){
printf("0\n");
continue;
}
memset(hash,0,sizeof(hash));
for(int i = 1; i<=100;i++){
for(int j=1;j<=100;j++){
//构造哈希函数让每个值都有一个不同的key
hash[a*pin[i]+b*pin[j]+1000000]++;
}
}
sum = 0;
for(int i= 1;i<=100;i++){
for(int j=1;j<=100;j++){
//查找是否有满足条件的key,有的话记录+1
sum += hash[-(c*pin[i]+d*pin[j])+1000000];
}
}
printf("%d\n",sum*16);
}
return 0;
}

当然可以来一个它的优化版本了

因为两层循环最多只可能产生10000个不同的结果,开200w的数组将会浪费很多初始化的时间,所以开小数组+处理冲突会比较好

//由于100 * 100 只有10000个不同的结果,
//因此只需要大于10000就可以了
//因此本题是可以根据这个条件对上面那个代码进行优化的 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50001 int f[MAX],g[MAX]; int hash(int k){
int t = k%MAX;
if( t < 0 )
t += MAX;
//这个是解决冲突的核心,
//前面的f[t]用来将占位的位置后移 后面那个g[t]的存在当然是为了查找
while(f[t]!=0 && g[t]!=k){
t = (t+1)%MAX;
}
return t;
} int main(){
int a, b, c, d, i, j,s,p, sum=0, t[101];
for( i=1;i<=100;i++)
t[i] = i*i;
while(~scanf("%d%d%d%d",&a,&b,&c,&d)){
if((a>0 && b>0 && c>0 && d>0)||(a<0 && b<0 && c<0 && d<0)){
printf("0\n");
continue;
}
memset(f,0,sizeof(f)); for( i=1;i<=100;i++){
for( j=1;j<=100;j++){
s = a*t[i] + b*t[j];
p = hash(s);
g[p] = s;
f[p]++;
}
}
sum = 0; //用来计数的
for( i=1;i<=100;i++){
for( j=1;j<=100;j++){
s = -(c*t[i]+d*t[j]);
p = hash(s);
//如果p这个数在f数组中存在则计数加1
sum += f[p];
}
}
printf("%d\n",sum*16);
}
}

HDU-1496(哈希表)的更多相关文章

  1. hdu 1496 Equations hash表

    hdu 1496 Equations hash表 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1496 思路: hash表,将原来\(n^{4}\)降 ...

  2. hdu acm 1425 sort(哈希表思想)

    sort Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. hdu 5183. Negative and Positive (哈希表)

    Negative and Positive (NP) Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  4. HDU4887_Endless Punishment_BSGS+矩阵快速幂+哈希表

    2014多校第一题,当时几百个人交没人过,我也暴力交了几发,果然不行. 比完了去学习了BSGS才懂! 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4887 ...

  5. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

  6. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  7. ELF Format 笔记(十五)—— 符号哈希表

    ilocker:关注 Android 安全(新手) QQ: 2597294287 符号哈希表用于支援符号表的访问,能够提高符号搜索速度. 下表用于解释该哈希表的组织,但该格式并不属于 ELF 规范. ...

  8. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  9. 什么叫哈希表(Hash Table)

    散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构,也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. - 数据结构 ...

  10. 【哈希表】CodeVs1230元素查找

    一.写在前面 哈希表(Hash Table),又称散列表,是一种可以快速处理插入和查询操作的数据结构.哈希表体现着函数映射的思想,它将数据与其存储位置通过某种函数联系起来,其在查询时的高效性也体现在这 ...

随机推荐

  1. Mobile IP

    Mobile IP Proliferation(增生) of mobile devices: PDAs, laptops, smart phones, - As user moves, point-o ...

  2. asp.net mvc HtmlHelperExt EnumDropDownList

    public static class HtmlHelperExt { public static MvcHtmlString EnumDropDownList<TEnum>(this H ...

  3. 国产Linux下开发正式开工(deepin)

    配置开发环境 1.一般工具 在深度商店安装QQ,微信,安装一般软件WPS,Navicat数据库工具,文本编辑notepadqq. 影视娱乐爱奇艺,优酷,酷狗. 2.安装主要的开发环境 (1)c# 深度 ...

  4. Vue--- vue-cli 脚手架 安装 -reeber

    vue-cli 脚手架 安装   一. node安装 1)如果不确定自己是否安装了node,可以在命令行工具内执行: node -v  (检查一下 版本): 2)如果 执行结果显示: xx 不是内部命 ...

  5. 『ACM C++』HDU杭电OJ | 1418 - 抱歉 (拓扑学:多面体欧拉定理引申)

    呕,大一下学期的第一周结束啦,一周过的挺快也挺多出乎意料的事情的~ 随之而来各种各样的任务也来了,嘛毕竟是大学嘛,有点上进心的人多多少少都会接到不少任务的,忙也正常啦~端正心态 开心面对就好啦~ 今天 ...

  6. C++笔记011:C++对C的扩展——变量检测增强

    原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 在C语言中重复定义多个同名的变量是合法的,多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上. 在C++中,不允许定义多个同名的 ...

  7. 在Java中用正则表达式判断一个字符串是否是数字的方法

    package chengyujia; import java.util.regex.Pattern; public class NumberUtil { /** * 判断一个字符串是否是数字. * ...

  8. VirtualBox复制的虚拟机无法获取IP解决办法

    自从建立了这个账号后写了一篇,好几年没来了,今天来看看,顺便分享一下. 昨天晚上想玩玩zookeeper集群,在vb里复制了一台主机,可怎么也无法获取IP,经研究,终于还是解决了. 1.复制主机时勾选 ...

  9. 08JavaScript对象

    JavaScript 对象是拥有属性和方法的数据. 注:在 JavaScript 中,对象是非常重要的,当你理解了对象,就可以了解 JavaScript . 1.JavaScript 对象 在 Jav ...

  10. JS实现继承 JavaScript

    JS实现继承 JavaScript 定义一个父类: // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // ...