zoukankan      html  css  js  c++  java
  • POJ


    4 Values whose Sum is 0
    Time Limit: 15000MS Memory Limit: 228000K
    Total Submissions: 25615 Accepted: 7697
    Case Time Limit: 5000MS

    Description

    The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a + b + c + d = 0 . In the following, we assume that all lists have the same size n .

    Input

    The first line of the input file contains the size of the lists n (this value can be as large as 4000). We then have n lines containing four integer values (with absolute value as large as 228 ) that belong respectively to A, B, C and D .

    Output

    For each input file, your program has to write the number quadruplets whose sum is zero.

    Sample Input

    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 Output

    5
    

    Hint

    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).

    Source


    题目大意:给4列数,每列有n个数字,从每列中取一个数,求四个数相加为零的情况有多少种。
    思路:用两个数组,分别记录左边两列和右边两列的数相加的和,再将其中一个数组从小到大排列,将另一数组遍历一边,用二分的方法判断个数。
    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    int a[4005][4], sum1[16000001], sum2[16000001];
    int main()
    {
    	int n, mid;
    	
    	while (~scanf("%d", &n))
    	{
    		int k = 0;
    		for (int i = 0; i < n; i++)
    		{
    			scanf("%d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3]);
    		}
    		for (int i = 0; i < n; i++)
    		for (int j = 0; j < n; j++)
    		{
    			sum1[k] = a[i][0] + a[j][1];
    			sum2[k++] = a[i][2] + a[j][3];
    		}
    		sort(sum1, sum1 + k);
    
    		int num = 0;
    		for (int i = 0; i < k; i++)
    		{
    			int left = 0, right = k - 1;
    			while (left <= right)
    			{
    				mid = (left + right) / 2;
    				if (sum2[i] + sum1[mid] == 0)
    				{
    					num++;
    					for (int j = mid + 1; j < k; j++)
    					{
    						if (sum2[i] + sum1[j] == 0)
    							num++;
    						else
    							break;
    					}
    					for (int j = mid - 1; j >= 0; j--)
    					{
    						if (sum2[i] + sum1[j] == 0)
    							num++;
    						else
    							break;
    					}
    					break;
    				}
    				if (sum2[i] + sum1[mid] > 0)
    					right = mid - 1;
    				else
    					left = mid + 1;
    			}
    		}
    		printf("%d
    ", num);
    	}
    	return 0;
    }



  • 相关阅读:
    Extjs Ext.extend函数的使用
    Silverlight 4 用户名密码验证提示
    Balsamiq Mockups
    自定义RDLC报表的数据集(手工编辑rdlc文件,配置数据集)
    VS2010 帮助文档离线安装
    为 Silverlight 客户端生成服务
    将Win7电脑改造成无线路由
    RDLC报表:每页显示N条记录
    C# 禁止ALT+F4
    让C#程序run anywhere 脱离.net Framework框架环境
  • 原文地址:https://www.cnblogs.com/csu-lmw/p/9124466.html
Copyright © 2011-2022 走看看