hdu1496(用hash思想统计数目)
2014-01-28 16:41
176 查看
作为一个刚学hash的孩子,感觉这道题目很不错,灵活的运用的数组的下标。
解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2,
各自作为数组的下标,如果两部分相加为0,则满足等式;
代码如下:
解题步骤:如果用常规方法解,那么时间复杂度为O(n^4),肯定会超时,然后参考了网上的解题方法,将等式分成两个部分,a*x1^2+b*x2^2和c*x3^2+d*x4^2,
各自作为数组的下标,如果两部分相加为0,则满足等式;
代码如下:
#include<iostream> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<time.h> #include<math.h> #define eps 1e-9 #define N 500005*2 #define P system("pause") using namespace std; int hash1 ,hash2 ; int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout);cc int a,b,c,d; int i,j; 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(hash1,0,sizeof(hash1)); memset(hash2,0,sizeof(hash2)); for(i=1;i<=100;i++) for(j=1;j<=100;j++){ int k=i*i*a+j*j*b; if(k>=0) hash1[k]++; else hash2[-k]++; } int count=0; for(i=1;i<=100;i++) for(j=1;j<=100;j++){ int k=i*i*c+j*j*d; if(k>0) count+=hash2[k]; else count+=hash1[-k]; } printf("%d\n",16*count); } // P; return 0; }
相关文章推荐
- 利用hash空间换取时间的思想统计同成绩学生人数C++--王道机试
- 练习2-3:编一个程序用来打开文件并统计文件中以空格隔开的单词数目
- java基础语法练习--输入一串字符统计各字符数目
- 做一个统计单词数目的Atom插件
- 模拟思想和hash_set
- 利用hash统计分数
- C++ Primer(第四版) 课后习题6.8 统计空格制表符换行的数目
- 动物统计 (Hash)
- 统计n-k特殊集的数目
- hdu1496 Equations (hash)
- [3月6日的脚本] 统计指定文件扩展名的文件数目 (PowerShell)
- [Hash思想]UVa1152 - 4 Values whose Sum is 0
- Linux终端上统计指定类型文件的数目的方法
- Hash思想:映射
- 中期报告数目统计
- 数目nullRQNOJ-302-统计单词个数--区域dp
- EF-联合查询-结果集-Group by-统计数目
- 利用File类来实现对文件和文件夹数目的统计
- 利用状态机编程思想求解统计英文句子中单词个数问题
- 第十三周上机项目5--(3) 字符串中字符数目的统计