Uva 1152 和为0的4个值 hash/二分
来源:互联网 发布:口袋妖怪游戏作弊软件 编辑:程序博客网 时间:2024/05/16 19:20
题意:
给定4个n(1 <= n <= 4000)元素集合A, B, C, D,要求分别从中选取一个元素a, b, c, d,使得a+b+c+d = 0,问有多少种选法。
分析:
显然四重循环是过不了的,我先想到的是用map把a+b,c+d分别保存起来,然后在查找统计。超时。。。。
然后书上说用哈希表去实现,看到有的题解hash表示的太巧妙了,学习一下。
还有就是这题可以用二分解决,先计算出a+b,然后枚举c+d,然后二分找出范围即可。
hash 630ms:
#include<cstdio>#include<cstring>const int N=4005;int a[4][N];struct Hash_map{ static const int mask=0x7fffff; int p[mask+1],q[mask+1]; void clear() { memset(q,0,sizeof(q)); } int& operator [](int k) { int i; for(i=k&mask;q[i]&&p[i]!=k;i=(i+1)&mask); p[i]=k; return q[i]; }};Hash_map Hash;int main(){ int T;scanf("%d",&T); for(int t=0;t<T;t++){ int n; scanf("%d",&n); for(int j=0;j<n;j++) for(int i=0;i<4;i++)scanf("%d",&a[i][j]); Hash.clear(); for(int i=0;i<n;i++) for(int j=0;j<n;j++) Hash[a[0][i]+a[1][j]]++; int ans=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans+=Hash[-a[2][i]-a[3][j]]; if(t)printf("\n"); printf("%d\n",ans); } return 0;}
二分 、2720ms:
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N=4005;int a[4][N];int sum[N*N];int main(){ int T;scanf("%d",&T); for(int t=0;t<T;t++){ int n; scanf("%d",&n); for(int j=0;j<n;j++) for(int i=0;i<4;i++)scanf("%d",&a[i][j]); int cnt=0; for(int i=0;i<n;i++) for(int j=0;j<n;j++) sum[cnt++]=a[0][i]+a[1][j]; int ans=0; sort(sum,sum+cnt); for(int i=0;i<n;i++) for(int j=0;j<n;j++) ans+=upper_bound(sum,sum+cnt,-a[2][i]-a[3][j])-lower_bound(sum,sum+cnt,-a[2][i]-a[3][j]); if(t)printf("\n"); printf("%d\n",ans); } return 0;}
0 0
- Uva 1152 和为0的4个值 hash/二分
- uva 1152 和为0的4个值
- 例题 8-3 UVA - 1152 4 Values whose Sum is 0(和为0的4个值)(二分枚举)
- poj 2785 求4个数相加和为0 的个数 hash 或者二分
- 和为0的4个值(4 Values Whose sum is Zero UVa 1152)
- 例题 8-2 和为0的4个值 UVa 1152
- 《算法竞赛》第二版 237页 uva 1152 和为0的4个值
- uva 1152 和为0的4个值(中途相遇法)
- 中途相遇法,哈希技术(和为0的4个值,uva 1152)
- uva 1152 4 Values whose Sum is 0(二分_中途相遇|| hash)
- 例题8-3 和为0的4个值(4 Values Whose Sum is Zero, ACM/ICPC SWERC 2005, UVa 1152)
- [UVa 1152] 和为0的四个值(4 Values whose Sum is 0)
- UVA 1152 4 Values whose Sum is 0 (hash)
- 51Nod 1090 3个数的和为0 && 1267 4个数的和为0 (排序+二分)
- UVA 1152 4 Values whose Sum is 0 (二分)
- 51NOD 1267 4个数和为0(二分 + 排序)
- 51nod 1267 4个数和为0 哈希+二分
- 51Nod 1267 4个数和为0 ( 二分
- ImageView常用XML属性
- mybatis传参问题,一个或多个参数
- js事件多次绑定问题
- disconf 分布式配置
- /etc/sysconfig/clock内容解释
- Uva 1152 和为0的4个值 hash/二分
- 时间戳和日期转换
- 深入理解Fsync
- 关于object-C中的ARC机制
- bzoj 2957: 楼房重建(线段树)
- unity5.3 VR开发
- IOS9应用隐私控制-外部调用
- 小白学习Android MVP和SharedPreferences存储JSONArray
- POI常用