POJ-2785 4 Values whose Sum is 0(折半枚举 sort + 二分)
2015-11-10 18:41
447 查看
题目链接:http://poj.org/problem?id=2785
题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数.
其中一个数列有多个相同的数字时,把他们看作不同的数字.
做法是把前两个数列和的值存在一个数组(A)中 , 后两个数列的和存在另一个数组(B)中 , 数组都为n^2 . 然后将B数组sort一下 , 将A数组遍历 , 二分查找一下B数组中与A数组元素和为0的个数 . 有个注意的点是万一A数组都是0 , 而B数组都为0的情况(还有其他情况) , 那二分只能找到一个与之符合的情况 . 所以可以再找刚好比符合数大的数 , 相减他们的位置, 然后加起来 , 就是答案.
这里可以用到两个函数lower_bound()和upper_bound() ,都用了二分查找,前面的函数是返回一个数组中大于或等于一个数的位置,后面的是返回大于这个数的位置(不懂的可以Google or baidu一下这两个函数怎么用).
代码如下:
题意是给你4个数列.要从每个数列中各取一个数,使得四个数的sum为0,求出这样的组合的情况个数.
其中一个数列有多个相同的数字时,把他们看作不同的数字.
做法是把前两个数列和的值存在一个数组(A)中 , 后两个数列的和存在另一个数组(B)中 , 数组都为n^2 . 然后将B数组sort一下 , 将A数组遍历 , 二分查找一下B数组中与A数组元素和为0的个数 . 有个注意的点是万一A数组都是0 , 而B数组都为0的情况(还有其他情况) , 那二分只能找到一个与之符合的情况 . 所以可以再找刚好比符合数大的数 , 相减他们的位置, 然后加起来 , 就是答案.
这里可以用到两个函数lower_bound()和upper_bound() ,都用了二分查找,前面的函数是返回一个数组中大于或等于一个数的位置,后面的是返回大于这个数的位置(不懂的可以Google or baidu一下这两个函数怎么用).
代码如下:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int MAXN = 4010; typedef long long LL; LL a[MAXN] , b[MAXN] , c[MAXN] , d[MAXN]; LL num1[MAXN * MAXN] , num2[MAXN * MAXN]; int main() { int n; while(~scanf("%d" , &n)) { for(int i = 0 ; i < n ; i++) { scanf("%lld %lld %lld %lld" , a + i , b + i , c + i , d + i); } int f = 0; for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < n ; j++) { num1[f] = a[i] + b[j]; num2[f++] = c[i] + d[j]; } } LL res = 0; int temp = 0; sort(num2 , num2 + f); for(int i = 0 ; i < f ; i++) { temp = lower_bound(num2 , num2 + f , -num1[i]) - num2; if(temp < f && num2[temp] + num1[i] == 0) { res += upper_bound(num2 , num2 + f , -num1[i]) - num2 - temp; } } cout << res << endl; } }
相关文章推荐
- How Did Watson Answer? —— Factoid Question Decomposition
- cloudstack GuestNetwork Ingress-Egress rule
- UITextField实现UITextView监控值变化的功能textViewDidChange
- UIAlertView上添加输入框UITextField
- UGUI - 长按事件实现
- iOS 9界面适配利器:详解Xcode 7的新特性UIStackView
- LCS(Longest Common Subsequence 最长公共子序列)
- 77.下拉刷新MJRefresh和UITableView的section headerView冲突的原因分析与解决方案
- Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )
- Android开发UI之响应系统UI变化
- leetcode 303: Range Sum Query - Immutable
- iOS摄像头和相册-UIImagePickerController-浅析
- Queue
- iOS 开发之UIAlertController
- 关于getparameter()取不到值的问题和jbuilder安装问题
- UIButton中内容大小,以及UITextFiled改变和选中
- iOS UIDataDetectorType 详解
- 微软的COM中GUID和UUID、CLSID、IID .
- 多个ViewController 只隐藏一个ViewController的UINavigationBar 和UITabBar
- UILabel和UIButton