POJ 1840.Eqs
2017-11-08 18:26
295 查看
题目:http://poj.org/problem?id=1840
AC代码(C++):
总结: 对题目的表达式变形得到a1x13+ a2x23+ a3x33 = -a4x43 - a5x53, 于是问题转换成了数字哈希. 将左边表达式的和插入哈希表, 执行次数为100的3次方(如果暴力枚举则是100的5次方, 绝壁超时), 然后再用右边表达式的和来查表, 执行次数为100的2次方.
AC代码(C++):
#include <iostream> #include <algorithm> #include <stdio.h> #include <vector> #include <queue> #include <math.h> #include <string> #include <string.h> #include <bitset> #define INF 0xfffffff #define MAXN 100005 using namespace std; const int N = 1030305; const int H = 1000007; struct Node { int num; int next; }; Node node[N]; int cur; int hashTable[H]; int a1,a2,a3,a4,a5; void initHash() { cur = 0; for (int i = 0; i < H; ++i) hashTable[i] = -1; } void insertHash(int num) { int h = abs(num)%H; node[cur].num = num; node[cur].next = hashTable[h]; hashTable[h] = cur; cur++; } int main(){ initHash(); cin>>a1>>a2>>a3>>a4>>a5; for(int i = -50; i <= 50; i++){ for(int j = -50; j <= 50; j++){ for(int k = -50; k <= 50; k++){ if(i==0||j==0||k==0)continue; int num = a1*i*i*i + a2*j*j*j + a3*k*k*k; insertHash(num); } } } int ans = 0; for(int i = -50; i <= 50; i++){ for(int j = -50; j <= 50; j++){ if(i==0||j==0)continue; int num = (-a4)*i*i*i + (-a5)*j*j*j; int next = hashTable[abs(num)%H]; while(next != -1){ if(node[next].num == num)ans++; next = node[next].next; } } } cout<<ans; }
总结: 对题目的表达式变形得到a1x13+ a2x23+ a3x33 = -a4x43 - a5x53, 于是问题转换成了数字哈希. 将左边表达式的和插入哈希表, 执行次数为100的3次方(如果暴力枚举则是100的5次方, 绝壁超时), 然后再用右边表达式的和来查表, 执行次数为100的2次方.
相关文章推荐
- POJ1840___Eqs(哈希表)
- [POJ1840]-Eqs
- POJ-1840-Eqs
- Poj 1840 Eqs(Hash)
- POJ 1840 Eqs
- poj1840--Eqs
- POJ1840——哈希——Eqs
- POJ 1840 Eqs
- poj 1840 Eqs
- poj 1840 Eqs 【hash】
- poj 1840 Eqs (Hash)
- Eqs - poj 1840(hash)
- poj 1840 Eqs(hash表)
- Eqs - POJ 1840 哈希
- poj 1840 Eqs 暴力
- poj_1840 Eqs(二分查找 / 哈希)
- POJ 1840 Eqs(模拟+哈希)
- POJ1840___Eqs(哈希表)
- POJ-1840 Eqs
- poj1840——Eqs