您的位置:首页 > 产品设计 > UI/UE

uva 1152 4 Values whose Sum is 0

2015-08-12 23:47 525 查看
题目大意:给定四个各包含n个数字的集合,现在问从各个集合中选择一个数,问a + b + c + d = 0 的排列有多少,条件是 (a, b, c ,d )属于 AxBxCxD。

解题:个人觉得此题应该是一个暴力题,就是先计算出a+b ,然后遍历c+d,接下来就是查找一下 a+b = -c-d,有多少种了而已。

我们这里使用hash技术来查询。注:使用STL中map一不小心就、、。。。。。。。TLE。

//
// main.cpp
// uva 1152 - 4 Values whose Sum is 0
//
// Created by XD on 15/8/12.
// Copyright (c) 2015年 XD. All rights reserved.
//

#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
#define ll long long
using namespace std ;
int A[4010] ;
int B[4010] ;
int C[4010] ;
int D[4010] ;
ll ans ;
int n ;
struct node{
int key ;
;int num ;
node() ;
};
node::node()
{
num=0 ;
}

int key[16000010] ;
int num[16000010] ;

const int hashsize = 1000003 ;
int head[hashsize] ;int tnext[160000010] ;
void init()
{
memset(head, 0, sizeof(head)) ;
memset(tnext, 0, sizeof(int) * (n * n ) + 5) ;
// memset(num, 0, sizeof(n * n )) ;
}
int HASH(int s)
{
return abs(s) % hashsize ;
}
void insert_into_table(int pos)
{
int h = HASH(key[pos]) ;
int u = head[h] ;
while (u != 0 ) {
if (key[u] == key[pos]) {
num[u]++ ;
return ;
}
u = tnext[u] ;
}
tnext[pos] = head[h] ;
head[h] = pos ;
num[pos]= 1;
}

int findNumFromTable(int k)
{
int u ;
int h = HASH(k) ;
u = head[h] ;
while (u != 0 ) {
if (key[u] == k) {
return num[u];
}
u = tnext[u] ;
}
return 0 ;
}

int main(int argc, const char * argv[]) {
int casenum ;
scanf("%d",&casenum) ;
int flag = 0 ;
while (casenum--) {
if (flag==1) {
printf("\n") ;
}
flag = 1 ;
scanf("%d" ,&n) ;
for (int i = 0; i<n; i++) {
scanf("%d%d%d%d" , &A[i] ,&B[i],&C[i],&D[i]) ;
}
init() ;
int t = 1 ;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
key[t] = A[i] + B[j] ;
insert_into_table(t) ;
t++ ;
}
}
ans = 0 ;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
int k = C[i] + D[j] ;
ans += findNumFromTable(-k) ;
}
}
printf("%lld\n" ,ans) ;
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: