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

poj 2785 4 Values whose Sum is 0

2012-03-28 02:13 260 查看
二分枚举;

也可以将两个和数组都排序,这样可以在查找时保持沿一个方向,最坏情况下复杂度为O(n),不如二分查找;

计算cpd[]时,c[i] + d[j]错写成c[i]+d[i]查了半天才发现。。。

# include <stdio.h>
# include <stdlib.h>

# define MAXN 4001

int apb[MAXN*MAXN], cpd[MAXN*MAXN];
int a[MAXN], b[MAXN], c[MAXN], d[MAXN];

int cmp(const void *a, const void *b)
{
return (*(int *)a - *(int *)b);
}

int bin_search(int *a, int key, int n);

int main()
{
int n, i, j, ans, t;

while (~scanf("%d", &n))
{
for (i = 0; i < n; ++i)
scanf("%d%d%d%d", &a[i], &b[i], &c[i], &d[i]);
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
{
apb[i*n + j] = a[i] + b[j];
cpd[i*n + j] = c[i] + d[j];
}
qsort(apb, n*n, sizeof(int), cmp);
t = n*n;
for (ans = i = 0; i < t; ++i)
ans += bin_search(apb, -cpd[i], t);
printf("%d\n", ans);
}

return 0;
}

int bin_search(int *a, int key, int n)
{
int cnt, up, low, mid, t;

cnt = 0;
up = n-1;
low = 0;
while (low <= up)
{
mid = (up + low) >> 1;
if (key == a[mid]) break;
if (key < a[mid]) up = mid - 1;
else low = mid + 1;
}
if (key == a[mid])
{
++cnt;
t = mid;
while (t > 0 && key == a[--t]) ++cnt;
while (mid < n-1 && key == a[++mid]) ++cnt;
}
return cnt;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: