4 Values whose Sum is 0 POJ - 2785(二分查找)
2017-03-08 23:50
302 查看
题意:给出四列数,要求从每一列中选择一个使得最终四个数的和为0,求有多少种情况。
分析:直接枚举的复杂度是O(n^4) 明显TL ,用二分进行简化的话是O(n^2) 。首先枚举前两列的和,然后再从后两列中查找和为前两列和的结果就可以了,因为在后两列中可能会在相同列中会出现相同的数,排完序后用upper_bound和lower_bound可以轻松求出(这样又简化了时间)。
收获:第一次接触二分查找的题目,
枚举超时的时候,试试二分能不能简化。对于大于三重的枚举来说一般都可以二分简化复杂度。
upper_bound会在数组中找到这个数最大能插入的位置;
lower_bound会在数组中找到这个数最小能插入的位置;
两者相减正好是排好序之后的数组中某个元素的个数(双击666)
分析:直接枚举的复杂度是O(n^4) 明显TL ,用二分进行简化的话是O(n^2) 。首先枚举前两列的和,然后再从后两列中查找和为前两列和的结果就可以了,因为在后两列中可能会在相同列中会出现相同的数,排完序后用upper_bound和lower_bound可以轻松求出(这样又简化了时间)。
收获:第一次接触二分查找的题目,
枚举超时的时候,试试二分能不能简化。对于大于三重的枚举来说一般都可以二分简化复杂度。
upper_bound会在数组中找到这个数最大能插入的位置;
lower_bound会在数组中找到这个数最小能插入的位置;
两者相减正好是排好序之后的数组中某个元素的个数(双击666)
#include <iostream> #include <algorithm> using namespace std; int a[4 4000 500]; int b[4500]; int c[4500]; int d[4500]; int e[4500*4500]; int main () { int k; cin >> k; for(int i=0;i<k;i++) { cin >> a[i] >> b[i] >> c[i] >> d[i]; } int z=0; for(int i=0;i<k;i++) { for(int j=0;j<k;j++) { e[z++]=a[i]+b[j]; } } sort(e,e+z); int sum = 0; for(int i=0;i<k;i++) { for(int j=0;j<k;j++) { int num=c[i]+d[j]; sum += upper_bound(e,e+z,-num)-lower_bound(e,e+z,-num); } } cout << sum << endl; }
相关文章推荐
- 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 (二分+sort)
- 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 - 2785 (二分)
- 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 A 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 Hash | sort+二分
- POJ 2785 4 Values whose Sum is 0 <二分>