雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  在线离线查找,二分查找,三分查找

摘要:http://ac.jobdu.com/problem.php?pid=1544(1)RMQ算法#include int A[100099],d[100099][20];int n,m; int min(int a,int b){ return a int A[100099];int B[100099]; int main(){ int n,m; while(scanf("%d",&n)!=EOF){ int i,j; for(i=1;i<=n;i++){ scanf("%d",&A[i]); } ... 阅读全文

posted @ 2013-10-07 11:13 huhuuu 阅读(366) 评论(0) 推荐(0) 编辑

摘要:面试中比较多会出序列有关的面试题,所以就总结下(1)一个长度N为的序列,求前K小的数 1.排序 N*log(N) 2.最大堆N*log(K) 3.有平均时间复杂度O(n)的算法,因为我们可以在O(n)的时间内找到未排序数组里面第k小的数的值,然后再遍历一下数组,把值小于等于第k小的全都输出(感谢huangnima)(2)有两个长度为N的有序序列A和B,在A和B中各任取一个数可以得到N^2个和,求这N^2个和中最小的N个。 1.比较直观的想法是将A与B的数字相加后排序,时间复杂度O(N*N*log(N*N)) 2.考虑到要求的是求最小的N个数字,所以从这里考虑优化,维护一个大小为N... 阅读全文

posted @ 2013-10-05 20:13 huhuuu 阅读(1562) 评论(6) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?pid=1534给定两个整型数组A和B。我们将A和B中的元素两两相加可以得到数组C。譬如A为[1,2],B为[3,4].那么由A和B中的元素两两相加得到的数组C为[4,5,5,6]。现在给你数组A和B,求由A和B两两相加得到的数组C中,第K小的数字。对于每个测试案例,输入的第一行为三个整数m,n, k(1#include#includeusing namespace std;long long a[109999];long long b[109999];long long n,m;long long cmp(long long a 阅读全文

posted @ 2013-09-13 22:04 huhuuu 阅读(1169) 评论(0) 推荐(0) 编辑

摘要:http://pat.zju.edu.cn/contests/pat-a-practise/1057题目的意思是可以在一个可以任意添加于删除整数的集合里随时查找该集合的中位数每次查找用nlogn的方法显然会超时所以要一种方法接近0(N)的查找方法, ( 计算第k大的数会超时!!)比如当前有1,4,7则树状数组的sum结果会是 1,1,1,2,2,2,3现在就变成了二分查找(3+1)/2 ,即2的最左端的位置ps: 2分查找有两种形式 (有一种会出错)int find(int value)// 1,2,3 { int mid,ll=1,rr=3; while(ll#include#i... 阅读全文

posted @ 2013-09-01 11:42 huhuuu 阅读(581) 评论(0) 推荐(0) 编辑

摘要:给出两个数,已知一个数的进制,求是否可以在某进制下两数相等。此题有个坑,进制在35以内,但是求的进制是远大于35穷举法可以过大部分数据,第7个数据不能过,所以就先穷举,特殊值在二分View Code #include<stdio.h>#include<iostream>#include<stack>#include<math.h>#include<string.h>using namespace std;int main(){ char s1[19],s2[19],st[19]; int tag,radix,max=0; scanf( 阅读全文

posted @ 2013-05-10 16:35 huhuuu 阅读(347) 评论(0) 推荐(0) 编辑

摘要:查询某个数字第N次出现在数列的位置mapView Code #include<stdio.h>#include<map>#include<string.h>#include<iostream>using namespace std;int mhash[1000099];struct data{ int x,y; friend bool operator <(data a,data b){//用map一定要写,不然会出错 if(a.y==b.y) return a.x<b.x; else return a.y<b.y;... 阅读全文

posted @ 2013-02-05 22:27 huhuuu 阅读(248) 评论(0) 推荐(0) 编辑

摘要:http://ac.jobdu.com/problem.php?cid=1039&pid=20统计一个数字在排序数组中出现的次数。因为观察的题目时间复杂度为O(n),所以先到一次遍历动态查找显然不现实,所以用离线查找,将需要查找的先进行排序,在一次遍历提供两组数据以供测试101 2 2 2 3 3 3 3 4 56-1 -9 1 3 4 2101 2 2 2 3 3 3 3 4 5101 2 2 2 3 3 3 3 4 5View Code #include<stdio.h>#include<iostream>#include<algorithm>u 阅读全文

posted @ 2013-01-12 14:20 huhuuu 阅读(435) 评论(0) 推荐(0) 编辑

摘要:先 folyd 求出任意两点可以到达的距离,由于我们不知道最短距离为多少,所以用二分查找来逼近答案接着构建容量网络:增加 源点 (n+1),设置源点到牛的容量为1 (一开始以为是INF,显然是错的)增加 汇点 (0),设置汇点到机器的容量为 M在通过二分出来的那个答案,统计牛到机器的容量最后网络流最大流,继续二分,直到最佳答案View Code #include<stdio.h>#include<string.h>const int inf=100000000;const int MAXN=309;int map[MAXN][MAXN];int dis[MAXN][MA 阅读全文

posted @ 2012-03-21 22:36 huhuuu 阅读(333) 评论(0) 推荐(0) 编辑

摘要:为什么我们会用二分,三分查找?因为我们不知道一个题目的准确答案,可以用二分,三分查找逼近答案如果一个问题是明显的单调性的话,用二分一个问题是明显的凸函数的话,三分而问题的重点是如何写出函数,还有函数上下限的控制!!! 阅读全文

posted @ 2012-01-09 09:49 huhuuu 阅读(200) 评论(0) 推荐(0) 编辑

摘要:三分主要推出fun函数fun(A)的意义就是在原来坐标上的点经过A弧度逆旋转后,正方形(边与坐标轴平行)最小边长要多长fun()在旋转的时候符合凸函数,所以三分求最值View Code #include<stdio.h>#include<math.h>#include<iostream>using namespace std;const double maxn=0xfffffffffffff;const double minn=-0xfffffffffffff;const double PI=acos(-1.0);double x[39],y[39];int 阅读全文

posted @ 2012-01-08 21:37 huhuuu 阅读(847) 评论(0) 推荐(0) 编辑

摘要:随着人的移动,求影子长短的变化,求最长先写凸函数,注意是分段函数double temp=h*1.0/H*d; double y; if(x<temp) y=(x*H-h*d)/(-d+x)+x; else y=(d-x)*h*1.0/H;三分模板一套就0了View Code #include<stdio.h>double ll,rr,mid,midmid,H,h,d;double fun(double x){ double temp=h*1.0/H*d; double y; if(x<temp) y=(x*H-h*d)/(-d+x)+x; else ... 阅读全文

posted @ 2012-01-08 20:26 huhuuu 阅读(237) 评论(0) 推荐(0) 编辑

摘要:上届:最大的饼的面积下届:0二分。。。注意的是while条件与整数的二分查找有区别(r-l)>0.00001取PI的技巧:const double PI=acos(-1.0);View Code #include<stdio.h>#include<math.h>const double PI=acos(-1.0);double a[10009];int n,m;double ss(double r){ return r*r*PI;}int much(double s)//当面积为S时可以把这些饼分成几个有效饼{ int i; int add=0; for(i=0; 阅读全文

posted @ 2011-08-29 21:51 huhuuu 阅读(399) 评论(0) 推荐(0) 编辑

摘要:题目要求如何将月份分组就可以 使月份中的最大值最小二分查找上届:sum(a[i])下届:max(a[i])while(l<=r){ if(求的组别大于 题目要求) l=mid+1; else r=mid-1; ....统计(随时记录符合条件的月份中的最大值 的最小值)}注意 count<=m时就可以更新,count<m时一定可以分成m组View Code #include<stdio.h>int a[100009];int rmax;int zu(int max,int n)//可以分成几组{ int i; int add=1,t=0; rmax=0; ... 阅读全文

posted @ 2011-08-29 16:40 huhuuu 阅读(226) 评论(0) 推荐(0) 编辑