HDOJ1496 Equations【Hash】
题目大意:
有一个等式,
a*x1^2+b*x2^2+c*x3^2+d*x4^2=0,
a、b、c、d是[-50,50]之间的非零整数,
有一组解析(x1,x2,x3,x4),其中xi是[-100,100]之间的非零整数,
求有多少组解满足上式;
输入:多组测试用例,每组测试用例包含4个数:a,b,c,d,他们之间用一个或多个空格隔开,EOF结尾;
输出:每组测试用例解的个数;
==========基本思路=========
4个循环嵌套,回溯;但是这样的复杂度是n^4,在本题中就是10000 0000数量级的~
==========改进思路=========
把两项移到右边,就变成了左边两项与右边两项相等的式子;
这样只要分别计算左右两边相等的可能性即可,这样的复杂度就是10000数量级了~
==========================
a*x1^2 最大是50*10000 = 500000,其他三项也是,同理,最小是-500000;
两项的最大就是1000000,最小就是-1000000,这样就需要一个2000000的hash表来存储了;
但是要注意的是,最后hash表中存储的解得个数并不是最后结果,因为a、b、c、d四项可以互换位置,所以最后要乘以2^4 = 16才是解的个数;
Problem : 1496 ( Equations ) Judge Status : Accepted
RunId : 7413352 Language : C Author : qq1203456195
Code Render Status : Rendered By HDOJ C Code Render Version 0.01 Beta
#include <stdio.h> #include <string.h>int arr[101]; int hash[2000003]; int main() {int a,b,c,d;int i,j,sum;for (i=1;i<101;i++) arr[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 (i=1;i<=100;i++){for (j=1;j<=100;j++){hash[a*arr[i] + b*arr[j] + 1000000]++;}}sum = 0;for (i=1;i<=100;i++){for (j=1;j<=100;j++){sum += hash[-(c*arr[i] + d*arr[j]) + 1000000];}}printf("%d\n",sum<<4);}return 0; }
=======再次改进=======
很明显,双重循环最多产生10000个数,所以开2000000个空间的数组明显是浪费了,怎样优化呢?1、数组,2、hash函数,3、冲突处理
开小数组是必须的,但是并不是越小越好,因为还要考虑冲突的现象,但是具体取多少的?HDUACM的课件中开的是50021,这是一个较大的素数,这样key的位置就可以通过比较常用的除模取余方法来确定了。其实hash函数以及处理冲突的方法有很多,没有固定的方法。
下边是HDUACM课件中使用的方法:
int hash(int k) {int t=k%MAX;if(t<0)t+=MAX;while(f[t]!=0&&g[t]!=k)t=(t+1)%MAX;return t; }
hash函数:t = k%MAX
处理冲突的方法:t = (t+1)%MAX
完整代码:f数组用来统计个数,g数组用来记录值;
// by laili #include<stdio.h> #include<memory.h>#define MAX 50021int f[MAX],g[MAX];int hash(int k) {int t=k%MAX;if(t<0)t+=MAX;while(f[t]!=0&&g[t]!=k)t=(t+1)%MAX;return t; }int main() {int a,b,c,d,p,i,j,s,n,t[101];for(i=1;i<=100;i++)t[i]=i*i;while(scanf("%d%d%d%d",&a,&b,&c,&d)>0){……} }
while中代码:
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));n=0;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]++;}for(i=1;i<=100;i++)for(j=1;j<=100;j++){s=-(c*t[i]+d*t[j]);p=hash(s);n+=f[p];}printf("%d\n",n*16);
本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/archive/2012/12/18/2824091.html,如需转载请自行联系原作者
HDOJ1496 Equations【Hash】相关推荐
- 【hash】Seek the Name, Seek the Fame
[哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...
- 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】
[链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...
- HDOJ1800 Flying to the Mars【Hash】
题目大意: 8888年,地球被PPF王国统治了.由于人口增长,PPF需要为新生儿找寻更多的陆地.最后,PPF决定攻击通知Mars火星的Kscinow.问题来了,怎样让士兵到火星上去呢?PPF召集士兵征 ...
- P3370-[模板]字符串哈希【hash】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3370 大意 输出若干个字符串,求输入的字符串的总个数. 解题思路 ...
- jzoj3464-秀姿势【hash】
正题 给出n个数,删去k种数,使一种数连续的最长. 解题思路 用hash表储存每种数在leftleftleft到iii这个区间内没种数的个数,然后如果这个区间内的种数超过k+1个那么就移动left&q ...
- 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)
正题 luogu 1019 题目大意 给你若干个词语,让你把他们连起来(重复段叠在一起),每个词语最多用两次,问你该串最长是多少 解题思路 dfs枚举一个单词后面接哪个单词,然后枚举重叠长度,再用ha ...
- bzoj 2761: [JLOI2011]不重复数字【hash】
map会T,双hash会冲突--于是非酋写了个三hash #include<iostream> #include<cstdio> #include<cstring> ...
- 【HASH】【UVA 10125】 Sumset
传送门 Description 给定一个整数集合S,求一个最大的d,满足a+b+c=d,其中a,b,c,d∈S Input 多组数据,每组数据包括: 第一行一个整数n,代表元素个数 下面n行每行一个整 ...
- 【hash】兔子与兔子(C++)
Time Limit: 10 Sec Memory Limit: 128 MB Submit: 376 Solved: 75 [Submit][Status][Web Board] Descripti ...
最新文章
- combobox绑定数据
- 后台运行神器screen
- android关键应用程序,安卓开发:Android应用程序的四个关键点
- Apache Camel 3.1 –更多骆驼核心优化(第3部分)
- 删除文件及文件夹命令
- Ubuntu下使用Atom将Markdown文件转换为PDF的一个异常
- (转)你确定你的交易系统最快?
- jquery ztree 设置勾选_zTree 勾选checkbox
- shell转化bat工具_shell脚本与bat转换
- 最新PP点点通V2008简体中文版免费下载
- 微信收款没有提示通知消息,怎么打开?解决方案
- java 热度算法_Raddit算法Java实现
- Hyper-v安装CentOS
- 金蝶K3 BOM独立控制跳层开关开发
- Revit: AR and VR Workflows Revit:AR和VR工作流程 Lynda课程中文字幕
- 贪心算法-磁带最优存储问题
- PCB治具设计、制造和管理
- C#实例练习3:程序流程控制(2)
- linux下交叉编译jrtplib-3.9.1
- linux sftp 命令_Linux Sftp命令示例
热门文章
- 春节前51Aspx源码发布详情
- scala初学之helloWorld
- 分治法在求解“最近对”问题中的应用(JAVA)
- FileInputStreamTest
- java输出变量_Java笔记1: 输入输出与变量常量
- python里else中文意思_Python循环语句中else的用法总结
- 开发黑名单功能demo_中台实践:通用化黑名单平台
- 服务器操作系统策略,服务器操作系统策略
- java jframe 设置背景图片_JFrame如何设置背景图片
- php的c方法,thinkphp的c方法的使用