题目链接:http://poj.org/problem?id=2785

大意是输入一个n行四列的矩阵,每一列取一个数,就是四个数,求有多少种着四个数相加和为0的情况

首先脑海里想到的第一思维必然是一个个枚举,用四个for循环,那时间复杂度变成了On4,n的最大值是4000.

肯定会超时。那么,为了简化时间,首先我们可以开两个至少4000*4000的数组分别把第一列与第二列的和的情况

,第三列与第四列的和的情况存起来。这样就只用考虑两个数组的情况。

然后把两个数组排序,一个数组从头部开始同时另一个数组从尾部开始讨论和为0的情况(利用了递增性质和递减性质)

 #include<cstdio>
#include<algorithm>
using namespace std;
int a[],b[],c[],d[];
int ab[*+],cd[*+];
int main()
{
int n,i,j,k,num,sum,x;
while (~scanf("%d",&n))
{
for (i=;i<n;i++)
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
k=;
for (i=;i<n;i++){
for (j=;j<n;j++)
ab[k++]=a[i]+b[j];
}
k=;
for (i=;i<n;i++){
for (j=;j<n;j++)
cd[k++]=c[i]+d[j];
}
sort(ab,ab+n*n);
sort(cd,cd+n*n);
x=n*n-;sum=;
for (i=;i<n*n;i++)
{
while (x>=&&ab[i]+cd[x]>)
x--;
if (x<)
break;
num=x;
while (ab[i]+cd[num]==&&num>=)
{
sum++;
num--;
}
}
printf("%d\n",sum);
}
return ;
}

二分也很简单,找到相等个数就行

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[],b[],c[],d[];
int ab[*+],cd[*+];
int k2;
int check(int x)
{
int left=,right=k2-,mid;
while (left<=right)
{
mid=(left+right)/;
if (x==cd[mid])
{
int w=,e=mid;
while (x==cd[e]&&e<k2)
e++,w++;
e=mid-;
while (x==cd[e]&&e>)
e--,w++;
return w;
}
else if (x<cd[mid])
right=mid-;
else
left=mid+;
}
return ;
}
int main()
{
int t,i,j,q;
while (~scanf("%d",&t))
{
for (i=;i<=t;i++)
scanf("%d %d %d %d",&a[i],&b[i],&c[i],&d[i]);
memset(ab,,sizeof(ab));
memset(cd,,sizeof(cd));
int k1=,sum=;
k2=;
for (i=;i<=t;i++)
{
for (j=;j<=t;j++)
{
ab[k1++]=a[i]+b[j];
cd[k2++]=-(c[i]+d[j]);
}
}
sort(cd+,cd+k2);
for (i=;i<k1;i++)
sum+=check(ab[i]);
printf("%d\n",sum);
}
return ;
}

poj 2785 让和为0 暴力&二分的更多相关文章

  1. [51nod] 1267 4个数和为0 暴力+二分

    给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No". Input 第1行,1个数N,N为数组的长度(4 < ...

  2. [51nod] 1090 3个数和为0 暴力+二分

    给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3个数的组合.如果没有这样的组合,输出No Solution.如果有多个,按照3个数中最小的数从小到 ...

  3. poj3977 - subset - the second time - 暴力 + 二分

    2017-08-26 11:38:42 writer:pprp 已经是第二次写这个题了,但是还是出了很多毛病 先给出AC代码: 解题思路: 之前在培训的时候只是笼统的讲了讲怎么做,进行二分对其中一边进 ...

  4. POJ 2723 Get Luffy Out(2-SAT+二分答案)

    Get Luffy Out Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8851   Accepted: 3441 Des ...

  5. POJ 2785 4 Values whose Sum is 0 (二分)题解

    思路: 如果用朴素的方法算O(n^4)超时,这里用折半二分.把数组分成两块,分别计算前后两个的和,然后枚举第一个再二分查找第二个中是否有满足和为0的数. 注意和有重复 #include<iost ...

  6. POJ - 2785 4 Values whose Sum is 0 二分

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 25615   Accep ...

  7. POJ - 2785 - 4 Values whose Sum is 0 - 二分折半查找

    2017-08-01 21:29:14 writer:pprp 参考:http://blog.csdn.net/piaocoder/article/details/45584763 算法分析:直接暴力 ...

  8. POJ 2785:4 Values whose Sum is 0 二分

    4 Values whose Sum is 0 Time Limit: 15000MS   Memory Limit: 228000K Total Submissions: 18221   Accep ...

  9. 4 Values whose Sum is 0 POJ - 2785(二分应用)

    题意:输入一个数字n,代表有n行a,b,c,d,求a+b+c+d=0有多少组情况. 思路:先求出前两个数字的所有情况,装在一个数组里面,再去求后两个数字的时候二分查找第一个大于等于这个数的位置和第一个 ...

随机推荐

  1. shell-保留文件系统下剩余指定数目的文件

       path_backup=/mnt/fifth/backup/shellbackup  path_delete=/mnt/fifth/tmp/rubbish/  limit_num=15    f ...

  2. Pandas数据排序

    Pandas数据排序 .sort_index() 在指定轴上根据索引进行排序,索引排序后内容会跟随排序 b = pd.DataFrame(np.arange(20).reshape(4,5),inde ...

  3. SVN 报错“Previous operation has not finished; run 'cleanup' if it was interrupted” 原因及解决方案

    今天遇到的问题 svn无论是执行checkout,commit,update的时候提示需要cleap up,但 svn执行clean up命令时报错“Previous operation has no ...

  4. PR回写 所有物料规划PR时对净需求+最小采购批量+安全库存+舍入值的先后考虑逻辑

    所有物料规划PR时对净需求+最小采购批量+安全库存+舍入值的先后考虑逻辑20171207-1228.docx PR回写案例一: '; --SAFE_QTY:安全库存 ' ; -- MIN_LOT_SI ...

  5. veil-evasion免杀处理

    veil-evasion 开启 y 配置安装 安装好之后,再次运行veil-evasion 有50个payload模块 update 升级 list 查看有哪些payload 选一个payload 它 ...

  6. linux重新安装python

    第一步:下载python2.7  wget https://www.Python.org/ftp/python/2.7.12/Python-2.7.12.tar.xz 第二步: 解压刚刚下载的压缩包 ...

  7. 将MYSQL的GBK数据库转成_UTF-8数据库的简便方法

    http://wenku.baidu.com/link?url=epKvsEtUbtzdjQEezGdFMDvJiro3X1yKNgb-1cXzi7CEoYhtoJhImkuyTvVgSmfL6AQL ...

  8. js异步导致的错误

    没想到jquery的$.each也是异步,本身是循环验证数据,然后再提交数据,但是发现验证和提交一起发生了. 技术还不到位,所以 在定义了一个变量,var step = 0; 每循环一次step自增, ...

  9. Error in building opencv with ffmpeg

    I installed ffmpeg according to this article. ffmpeg installation was ok. Now I build opencv with ff ...

  10. POJ-1321.棋盘问题.(回溯)

    做完题之后看了网上的一些题解但是发现他们的解释大部分都是错误的,所以就自己写了一下,笔者能力也有限,有错误之处大家多多指正. 第一次看题的时候以为就是简单的八皇后,但是写了之后发现存在很多问题,比如需 ...