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;
}
解题:个人觉得此题应该是一个暴力题,就是先计算出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;
}
相关文章推荐
- 【UITextField与UITextView】
- 【UISegmentedControl】
- HDU 3397 Sequence operation(区间合并 + 区间更新)
- Request Parameters and Header Values
- [LeetCode]Permutation Sequence
- OC-UI部分,简单的登陆界面简单代码
- Domino Angular 前端UI开发
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- DCIM 用 UIScrollView 和UIPageControl
- js实现EasyUI-datagrid前台分页
- Leetcode63 Unique Paths II
- UIPageControl
- UI 06 _ 7种手势
- 消息队列(message queue)产生的背景、常用的技术
- hdu 1297 Children’s Queue(递推和高精)
- IOS--UI--NSThread 和GCD 总结
- Design Pattern -- Builder
- UI05 _ 分段控件 -- UISegmentedControl
- UIImageView+GestureRecognizer
- prim Building a Space Station