poj 2785 二分暴力
2015-09-13 11:04
190 查看
题意:给定四组数,每组数数量相同,最多4000个。问从四组数中各挑出一个之和为0的挑法有多少。
思路:直接枚举是N^4。这种题的做法一般是通过二分。将前两组之和 和 后两组之和分别枚举打表,排序。然后在后两个数之和里二分查找前两个数之和的相反数。复杂度是2*n^2+n^2*logn+n^2*log(n^2) = O(n^2*logn)。
记得还有一题是给定一个多项式的系数,有5个未知数,问解的个数。同样是前三组和后两组打表,然后二分。一般的,如果有n组数,那么应该分成数量相当的两组,然后排序二分。
思路:直接枚举是N^4。这种题的做法一般是通过二分。将前两组之和 和 后两组之和分别枚举打表,排序。然后在后两个数之和里二分查找前两个数之和的相反数。复杂度是2*n^2+n^2*logn+n^2*log(n^2) = O(n^2*logn)。
记得还有一题是给定一个多项式的系数,有5个未知数,问解的个数。同样是前三组和后两组打表,然后二分。一般的,如果有n组数,那么应该分成数量相当的两组,然后排序二分。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm> using namespace std; #define INF 0x3fffffff #define clr(s,t) memset(s,t,sizeof(s)) #define N 4005 int s[N*N],t[N*N],tmp [4]; int n,len; int main(){ int i,j,last,res=0; len = 0; scanf("%d",&n); for(i = 0;i<n;i++) for(j = 0;j<4;j++) scanf("%d",&tmp[i][j]); for(i = 0;i<n;i++) for(j = 0;j<n;j++){ s[len] = tmp[i][0]+tmp[j][1]; t[len++] = tmp[i][2]+tmp[j][3]; } sort(s, s+len); sort(t, t+len); for(i = 0;i<len;i++){ if(!i || s[i]!=s[i-1]) last = upper_bound(t, t+len, -s[i])-lower_bound(t, t+len, -s[i]); res += last; } printf("%d\n",res); }
相关文章推荐
- IE9、IE10浏览器提示是否下载json数据
- UNRECOGNIZED SELECTOR SENT TO INSTANCE 问题快速定位的方法
- Android Api Demos登顶之路(六十六)Graphics-->Animation Drawable
- qt中添加C语言源码若干问题
- Cocos2d-x Lua中多场景切换生命周期
- 接触与感受动物
- OpenCV3中的SURF特征点的寻找和匹配
- SQL UNIQUE 约束
- 多核心Linux内核路径优化的不二法门-序
- python学习——itertools模块
- poj 1062 跪求大神帮看,网上大牛的测试数据全过了,然而还是wa。。哭晕
- ARM汇编
- SSH整合 遇 非堆内存溢出问题java.lang.OutOfMemoryError: PermGen space 和 无法建表
- 多核心Linux内核路径优化的不二法门-序
- AE中开发中,读取mdb或gdb中图层时,判断图层是否存在
- HTML5拖放API
- C/C++语言的标准库函数malloc/free与运算符new/delete的区别
- Cocos2d-x Lua中生命周期函数
- 35选7示例
- android sdk环境安装