码迷,mamicode.com
首页 > 其他好文 > 详细

C - 4 Values whose Sum is 0(二分)

时间:2020-02-29 09:12:52      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:pre   exp   矩阵   space   str   解析   cst   follow   let   

题目链接:https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3593

    题意:输入n*4的矩阵,从4列中每个选一个数求有多少个和为0;

      1

      6

      -45 22 42 -16

      -41 -27 56 30

      -36 53 -37 77

      -36 30 -75 -46

      26 -38 -10 62

      -32 -54 -6 45

      Sample Explanation: Indeed, the sum of the five following quadruplets is zero: (-45, -27, 42, 30), (26, 30, -10, -46), (-32, 22, 56, -46), (-32, 30, -75, 77), (-32, -54, 56, 30).

    解析:暴力会超时。所以我们可以把前两列各个的和存下来,后两列的存下来。然后用二分查找即可。注意有重复和,所以找到一个符合条件的mid以后,要再mid前后各找一遍符合条件的和!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=4005*4005;
int a[maxn],b[maxn];
int m[4005][5];
int main()
{
    int n;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=4;j++)
                scanf("%d",&m[i][j]);
        }
        int tot=0;int tob=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                a[tot++]=m[i][1]+m[j][2];
                b[tob++]=m[i][3]+m[j][4];
            }
        }
        sort(b,b+tob);
    //    cout<<tot<<endl;
        int ans=0;
        for(int i=0;i<tot;i++)
        {
            int l=0,r=tot-1,mid;
            while(l<=r)
            {
                mid=(l+r)/2;
                if(a[i]+b[mid]>0)
                {
                    r=mid-1;
                }
                else if(a[i]+b[mid]<0)
                {
                    l=mid+1;
                }
                else
                {
                    for(int j=mid;j<tot;j++)
                    {
                        if(a[i]==-b[j])
                            ans++;
                        else
                            break;
                    }
                    for(int j=mid-1;j>=0;j--)
                    {
                        if(a[i]==-b[j])
                            ans++;
                        else
                            break;
                    }
                    break;
                }
            }
        }
        cout<<ans<<endl;
        if(t)
            cout<<endl;  //不清楚
    }
    
}

 

C - 4 Values whose Sum is 0(二分)

标签:pre   exp   矩阵   space   str   解析   cst   follow   let   

原文地址:https://www.cnblogs.com/liyexin/p/12381233.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!