博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 1840 Eqs 哈希处理
阅读量:5079 次
发布时间:2019-06-12

本文共 2841 字,大约阅读时间需要 9 分钟。

刚拿到这道题时,想到的肯定是暴力枚举啊。肯定超时。想到了立方乘系数,如果再枚举的话,还是会超时的。。无语。。

最后看了看了结题报告。。果然霸气。。。思维还是不够灵活是。。

将式子a1*x1^3 +a2*x2^3 + a3 * x3^3 + a4 * x4^3 + a5 * x5^3 = 0;转化成 a1*x1^3 +a2*x2^3 + a3 * x3^3 = - a4 * x4^3 - a5 * x5^3 

两边相等,将左边的数利用hash建立映射,然后枚举右边的数和利用hash查找。。。

开散列:

挂链 891ms

View Code
#include 
#include
#include
#include
#define maxn 107 #define N 9997 using namespace std; struct node {
int num; node *next; }*tagp[N],H[99999997]; int pos; int pw[maxn]; int main() {
int i,j,k,p; int a1,a2,a3,a4,a5; for (i = 0; i < 101; ++i) {
pw[i] = (i - 50)*(i - 50)*(i - 50); } while (~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)) {
pos = 0; memset(tagp,0,sizeof(tagp)); for (i = 0; i < 101; ++i) {
if (i == 50) continue; for (j = 0; j < 101; ++j) {
if (j == 50) continue; for (k = 0; k < 101; ++k) {
if (k == 50) continue; int tmp = a1*pw[i] + a2*pw[j] + a3*pw[k]; p = tmp%N; if (p < 0) p = -p; node *t = &H[pos++]; t->num = tmp; t->next = tagp[p]; tagp[p] = t; } } } int count = 0; for (i = 0; i < 101; ++i) {
if (i == 50) continue; for (j = 0; j < 101; ++j) {
if (j == 50) continue; int tmp = -a4*pw[i] - a5*pw[j]; p = tmp%N; if (p < 0) p = -p; node *q; for (q = tagp[p]; q != NULL; q = q->next) {
if (q->num == tmp) count++; } } } printf("%d\n",count); } return 0; }

vector 2610MS

View Code
#include 
#include
#include
#include
#include
#define maxn 107 #define N 9997 using namespace std; int pw[maxn]; vector
hash[N]; int main() { int i,j,k,p; int a1,a2,a3,a4,a5; for (i = 0; i < 101; ++i) { pw[i] = (i - 50)*(i - 50)*(i - 50); } while (~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5)) { for (i = 0; i < N; ++i) hash[i].clear(); for (i = 0; i < 101; ++i) { if (i == 50) continue; for (j = 0; j < 101; ++j) { if (j == 50) continue; for (k = 0; k < 101; ++k) { if (k == 50) continue; int tmp = a1*pw[i] + a2*pw[j] + a3*pw[k]; p = tmp%N; if (p < 0) p = -p; hash[p].push_back(tmp); } } } int count = 0; for (i = 0; i < 101; ++i) { if (i == 50) continue; for (j = 0; j < 101; ++j) { if (j == 50) continue; int tmp = -a4*pw[i] - a5*pw[j]; p = tmp%N; if (p < 0) p = -p; for (k = 0; k < hash[p].size(); ++k) { if (hash[p][k] == tmp) count++; } } } printf("%d\n",count); } return 0; }

转载于:https://www.cnblogs.com/E-star/archive/2012/03/29/2424070.html

你可能感兴趣的文章
计算机基础作业1
查看>>
Ubuntu 深度炼丹环境配置
查看>>
C#中集合ArrayList与Hashtable的使用
查看>>
从一个标准 url 里取出文件的扩展名
查看>>
map基本用法
查看>>
poj-1163 动态规划
查看>>
Golang之interface(多态,类型断言)
查看>>
Redis快速入门
查看>>
BootStrap---2.表格和按钮
查看>>
Linear Algebra lecture 2 note
查看>>
CRC计算模型
查看>>
Ajax之404,200等查询
查看>>
Aizu - 1378 Secret of Chocolate Poles (DP)
查看>>
csv HTTP简单表服务器
查看>>
OO设计的接口分隔原则
查看>>
数据库连接字符串大全 (转载)
查看>>
java类加载和对象初始化
查看>>
对于负载均衡的理解
查看>>
django简介
查看>>
window.event在IE和Firefox的异同
查看>>