关于折半查找
来源:互联网 发布:一个c语言程序的编写 编辑:程序博客网 时间:2024/06/03 20:58
今天没有什么特别的东西可以记载,就思考一下几天前在小学期上学的折半查找吧。起初我并不重视这个查找算法,刷题和竞赛中也不怎么碰到,但是学了之后才发现这个算法很有用,不是它查找的作用,而是它这种折半的思想,就比如说最近刷的cugboj1048木材加工(加强版),由于计算量巨大,我不得不采用折半的方法来求解,即找出数目的极限值,不断折半比较来寻找长度的最大值。
对字符串折半查找代码如下(基本的折半太简单,我只贴有价值的):
int zbcz(string a[],string s,int left,int right){ if(left>right) return 0; int mid=(left+right)/2; if(strcmp(a[mid].c_str(),s.c_str())<0) return zbcz(a,s,mid+1,right); //c_str()把string返回为char else if(strcmp(a[mid].c_str(),s.c_str())>0) return zbcz(a,s,left,mid-1); else return 1;}
下面是木材加工(加强版)原题及代码:
该题ac代码如下(原创,请勿复制粘贴):
#include<iostream>#include<algorithm>#include<iomanip>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>using namespace std;long long int a[60000],n;int comp(int i) { int j,sum=0; for(sum=0,j=0;j<n;sum+=a[j]/i,j++); return sum;}int main(){ long long int sum=60000,i,j,k,mid; long long int tol=0; cin>>n>>k; for(i=0;i<n;tol+=a[i],i++) cin>>a[i]; int left=1,right=tol; if(k>tol) { cout<<0<<endl; return 0; } while(1) { mid=(left+right)/2; if(comp(mid+1)<k&&comp(mid)>=k) break; else if(comp(mid)<k) right=mid-1; else left=mid+1; } cout<<mid<<endl; return 0;}
阅读全文
0 0
- 关于ACM折半查找
- 关于折半查找算法
- 关于折半查找
- 关于折半查找的思考
- 数据结构9-关于折半查找的实例
- 关于 折半查找 while 条件 < , <=
- 关于折半查找实现中的一个问题
- 关于折半查找的细节思考
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- 折半查找
- Deep Learning in Customer Churn Prediction (五) (Spark RDD 特征构建实践尝试)
- ubuntu中Apache2开启重写模式
- hdu_round1-1005 yyf倒水(bfs)
- leetcode#6. ZigZag Conversion
- myeclipse 项目代码修改不用重新启动tomcat的方法
- 关于折半查找
- 观察者模式案例
- 使用pip安装相应版本的包。
- express-6-路由对象
- 几个基础算法介绍和实现——基本概念
- int char String 之间的转换
- Map的相关知识点整理
- BZOJ 3158: 千钧一发
- 【Struts2】结果类型