关于折半查找

来源:互联网 发布:一个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;}
原创粉丝点击