Poj 2785 4 Values whose Sum is 0【二分】
来源:互联网 发布:淘宝网开店 编辑:程序博客网 时间:2024/05/22 02:34
4 Values whose Sum is 0
Time Limit: 15000MS Memory Limit: 228000KTotal Submissions: 20197 Accepted: 6053Case 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
Southwestern Europe 2005
题目大意:
一共四个集合,(每一列输入为一个集合),从每一个集合中拿出一个数使四个数和为0,一共有多少种选取方法。
思路:
将a+b+c+d==0转化为:a+b==-c-d;
1、首先考虑将集合c中的数和集合d中的数加起来存在数组cd【】中。
2、然后枚举a【i】+b【j】的值作为tmp,tmp=a【i】+b【j】,那么我们需要在数组cd【】中,找到最左边的-tmp位子作为zuo,和最右边的-tmp的位子作为you,那么其解ans+=you-zuo+1;
Ac代码:
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[5000];int b[5000];int c[5000];int d[5000];int cd[5000*5000];int n;int Erfendd(int tmp){ int l=0; int r=n*n-1; int mid; int ans=-1; while(r>=l) { mid=(l+r)/2; if(cd[mid]>=tmp) { r=mid-1; if(cd[mid]==tmp) { ans=mid; } } else l=mid+1; } return ans;}int Erfenuu(int tmp){ int l=0; int r=n*n-1; int mid; int ans=-1; while(r>=l) { mid=(l+r)/2; if(cd[mid]>tmp) { r=mid-1; } else { l=mid+1; if(cd[mid]==tmp) { ans=mid; } } } return ans;}int main(){ while(~scanf("%d",&n)) { for(int j=0;j<n;j++) { for(int i=0;i<4;i++) { if(i==0)scanf("%d",&a[j]); if(i==1)scanf("%d",&b[j]); if(i==2)scanf("%d",&c[j]); if(i==3)scanf("%d",&d[j]); } } int cont=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cd[cont++]=c[i]+d[j]; } } int ans=0; sort(cd,cd+cont); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { int tmp=a[i]+b[j]; tmp=-tmp; int zuo=Erfendd(tmp); if(zuo==-1)continue; int you=Erfenuu(tmp); ans+=you-zuo+1; } } printf("%d\n",ans); }}
0 0
- POJ 2785 4 Values whose Sum is 0 二分
- poj 2785 4 Values whose Sum is 0 (二分+枚举)
- POJ 2785 4 Values whose Sum is 0(二分)
- POJ 2785 4 Values whose Sum is 0 二分
- poj 2785 4 Values Whose Sum is 0 --- 二分
- poj 2785 二分问题 4 Values whose Sum is 0
- ACM-二分-POJ-2785-4 Values whose Sum is 0
- POJ 2785:4 Values whose Sum is 0 二分
- Poj 2785 4 Values whose Sum is 0【二分查找】
- POJ 2785 4 Values whose Sum is 0二分入门
- Poj 2785 4 Values whose Sum is 0【二分】
- poj 2785 4 Values whose Sum is 0(二分)
- poj 2785 4 Values whose Sum is 0 (二分)
- POJ - 2785 4 Values whose Sum is 0(二分枚举)
- POJ 2785 4 Values whose Sum is 0 <二分>
- 4 Values whose Sum is 0+二分答案+POJ
- POJ 2785 Values whose Sum is 0
- 4 Values whose Sum is 0 POJ
- linux环境下的vi编辑器详解(一)
- jquery中事件
- android中xml文件的作用及解释
- LinearRegressionWithSGD 问题
- PAT_A 1119. Pre- and Post-order Traversals (30)
- Poj 2785 4 Values whose Sum is 0【二分】
- 算法第四版3-2Binary Search Trees With C++ Implementation
- Intent概括
- 编写简单的内核模块——Linux操作系统原理与应用(陈莉君第2版13页)
- 使用排序算法对数组进行排序,按升序 注:数组内容只会有大写字母,且可能会出现重复,不允许使用java.util下的任何类
- 优雅编程之这样使用枚举和注解,你就“正常”了(二十九)
- 弱校连萌 2016 国庆训练计划 10,5 Problem A. As Easy As Possible
- Bias和Variance
- 排序的基本概念和分类