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

POJ2785——4 Values whose Sum is 0

2015-05-08 20:42 274 查看
题目链接:http://poj.org/problem?id=2785

4 Values whose Sum is 0

题目大意:给你n行4列数,让你在每一列中取一个数,然后相加,问有多少种组合(相加之和为0)?

解题思路:虽然给了15秒,但是直接暴力还是会超时的。接下来讲讲我的做法:首先将前两列任意两项相加得到数组x,再将后两列任意两项相加取反得到数组y,再将y排序,最后依次将x中的元素在y中进行二分查找,看有多少个相等的数加起来即为最终的结果。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int a[4010][4];
int x[16000001];
int y[16000001];
int ll,ans;

void bit_search(int t)
{
    int mid,l=0,r=ll-1;
    while(l<r)
    {
        mid=(l+r)>>1;
        if(y[mid]<t)
            l=mid+1;
        else
            r=mid;
    }
    while(y[l]==t&&l<ll)
    {
        ans++;
        l++;
    }
}

int main()
{
    int n,i,j,k,l;
    while(scanf("%d",&n)!=EOF)
    {
        int i,j;
        ans=0,ll=0;
        for(i=0;i<n;i++)
            scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                x[ll++]=a[i][0]+a[j][1];
        ll=0;
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                y[ll++]=-(a[i][2]+a[j][3]);
        sort(y,y+ll);
        for(i=0;i<ll;i++)
            bit_search(x[i]);
        printf("%d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: