题目链接: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. C++ CTreeview的checkbox使用方法

    1. 消息事件   (1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON.   (2)鼠标点击当前ITEM的TEXT:引发NM_CLIC ...

  2. Java学习01 (第一遍)

    java se - 桌面 java ee - 网页 Jdk :Jre 区别Jdk-开发环境必要Jre-运行环境需要Jdk包含Jre,安装完Jdk就可以了 Javac Demo1.java-Javac ...

  3. ubuntu 下安装和启动SSH 服务

    安装OPENSSH 服务端 sudo apt-get install openssh-server 查看进程是否启动 ps -e | grep ssh 删除密钥文件 rm /etc/ssh/ssh_h ...

  4. C# 模拟多线程下载文件

    原地址:http://www.cnblogs.com/Opiece/p/4803836.html 客户端 public static string strContent = ""; ...

  5. RMI 、RPC和SOAP

  6. 微擎框架下拉分页(使用js模板引擎)

    1.需要分页的页面,引入一下文件 <script language="javascript" src="\addons\{$_GPC['m']}\template\ ...

  7. max_element(C++)求数组最大元素

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...

  8. ssh架构之hibernate(一)简单使用hibernate完成CRUD

    1.Hibernate简介   Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,h ...

  9. uwsgi+nginx+django生产环境部署

    1.升级python到2.7版本 2.安装uwsgi 出现uwsgi未找到 yum groupinstall "Development tools"yum install zlib ...

  10. java 连接sqlserver数据库

    1.ResultSet executeQuery(String sql):执行某条查询语句并返回结果public static void main(String[] args) throws Exce ...