poj 2785(折半枚举+二分搜索)
题意:
给定 n 行数,每行都有 4 个数A,B,C,D。
要从每列中各抽取出一个数,问使四个数的和为0的所有方案数。
相同数字不同位置当作不同数字对待。
题解:
如果采用暴力的话,从4个数列中选择数组合,共有(N^4)种选择,故时间复杂度为O(N^4),指定会超时。
但,如果将它们分成 AB,CD两组,每组只有 N^2 个组合,而 N 的数据范围为 N < 4000,故采用此种方法不会超时。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
const int maxn=+; int n;
int a[maxn*maxn];
int b[maxn*maxn];
int num[maxn][]; ll Solve()
{
int index=;
for(int i=;i <= n;++i)
for(int j=;j <= n;++j)
{
a[index]=num[i][]+num[j][];//存储所有的A+B的值
b[index]=num[i][]+num[j][];//存储所有的C+D的值
index++;
}
sort(a+,a+index);
sort(b+,b+index);
ll res=;
/**
A+B+C+D=0 -> C+D=-(A+B)
而C+D的所有值已经预处理好,故可通过二分查找存在于b[]中 -(A+B) 的个数即可
**/
for(int i=;i < index;++i)
{
int t=lower_bound(b+,b+index,-a[i])-b;
int k=;
while(t < index && b[t] == -a[i])//查找 -(A+B) 的个数
k++,t++;
res += k;
}
return res;
} int main()
{
while(~scanf("%d",&n))
{
for(int i=;i <= n;++i)
for(int j=;j <= ;++j)
scanf("%d",&num[i][j]);
printf("%lld\n",Solve());
}
return ;
}
poj 2785(折半枚举+二分搜索)的更多相关文章
- 4 Values whose Sum is 0 POJ 2785 (折半枚举)
题目链接 Description The SUM problem can be formulated as follows: given four lists A, B, C, D of intege ...
- POJ 3977 折半枚举
链接: http://poj.org/problem?id=3977 题意: 给你n个数,n最大35,让你从中选几个数,不能选0个,使它们和的绝对值最小,如果有一样的,取个数最小的 思路: 子集个数共 ...
- Subset POJ - 3977(折半枚举+二分查找)
题目描述 Given a list of N integers with absolute values no larger than 10 15, find a non empty subset o ...
- poj 3977 Subset(折半枚举+二进制枚举+二分)
Subset Time Limit: 30000MS Memory Limit: 65536K Total Submissions: 5721 Accepted: 1083 Descripti ...
- POJ 3977 Subset(折半枚举+二分)
SubsetTime Limit: 30000MS Memory Limit: 65536KTotal Submissions: 6754 Accepted: 1277 D ...
- 【刷题记录】 && 【算法杂谈】折半枚举与upper_bound 和 lower_bound
[什么是upper_bound 和 lower_bound] 简单来说lower_bound就是你给他一个非递减数列[first,last)和x,它给你返回非递减序列[first, last)中的第一 ...
- NYOJ 1091 超大01背包(折半枚举)
这道题乍一看是普通的01背包,最最基础的,但是仔细一看数据,发现普通的根本没法做,仔细观察数组发现n比较小,利用这个特点将它划分为前半部分和后半部分这样就好了,当时在网上找题解,找不到,后来在挑战程序 ...
- poj1840 Eqs(hash+折半枚举)
Description Consider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The co ...
- 折半枚举(双向搜索)poj27854 Values whose Sum is 0
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 23757 Accep ...
随机推荐
- Pupet自动化管理环境部署记录
废话不多说了,下面记录下Puppet在Centos下的部署过程: puppet是什么puppet是一种基于ruby语言开发的Lnux.Unix.windows平台的集中配置管理系统.它使用自有的pup ...
- Visual Studio2013的安装过程及练习测试
一.安装环境: 支持安装的操作系统版本:Windows XP,Windows7,Windows8,Windows10. CPU大小:Intel(R)Core(TM)i5-4210U CPU @1.7G ...
- 【个人项目总结】C#四则运算表达式生成程序
S1&2.个人项目时间估算 PSP表格如下: PSP2.1 Personal Software Process Stages Time(Before) Time(After) Planning ...
- 《linux内核设计与分析》内核模块编程
内核模块编程 一.准备工作 虚拟机:VMware Workstation 12操作系统:ubuntu当前内核版本:linux-headers-4.4.0-22-generic 二.有关于内核模块的知识 ...
- text2
我的实践2代码已经传到GITHUb:https://github.com/jiaweihao/Test.git一下为测试结果截图:
- 08-java学习-数组-增强for循环-数组与方法-main函数参数
数组定义和使用 数组与方法的结合使用 main函数传参
- Node url模块
const url = require("url");var u = "https://www.jd.com:443/ad/index?uname=qd";// ...
- loadrunner 基础-学习笔记一
由于公司要使用loadrunner暂停学习jmeter 1 loadrunner组件: virtual user generator:录制最终用户业务流程并创建自动化性能测试脚本,vuser脚本 co ...
- c-lodop云打印实现手机打印 JS语句打印
Lodop和c-lodop目前只能安装到windows操作系统上,但是其他操作系统可通过向C-Lodop安装的电脑发送打印任务,实现手机广域网或局域网打印,打印语句也是简单的JS语句,可以轻松实现云打 ...
- JavaScript——DOM树的增查改删总结
对HTML DOM的操作是前端JavaScript编程时必备的技能,本文是我自己对DOM树操作的总结,主要是方法的罗列,原理性的讲述较少,适合大家用于理清思路或是温习 一.什么是HTML DOM? 是 ...