二分查找法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• cust暑期训练--二分 第二题 poj 3122 int main() { • 题目大意:给出饼的数量n 要分的份数f 还有每个饼的半径 int t; ra, 要求 将这些饼分成f+1份 每份的大小相等。且每份不能 cin>>t; while(t--){ 拼凑。 double l=0.0,r=0.0; double ra; cin>>n>>f; for(int i=1;i<=n;i++){ scanf("%lf",&ra); a[i]=ra*ra*pi; r+=a[i]; } while(r-l>eps){ double mid=(l+r)/2.0; if(check(mid))r=mid;//分大了 else l=mid; } printf("%.4lf\n",l); } return 0; }
int main() • 题目大意:将给定的n天每天的消费,将这n天的消费分成 { while(cin>>n>>m){ m 份,每份都是连续的。求分得的m份中(每份中求和) int l=0,r=0; 值最大的。二分答案 . for(int i=1;i<=n;i++){ scanf("%d",&a[i]); if(a[i]>l)l=a[i]; r+=a[i]; } while(l<r){ int mid=(l+r)/2; if(check(mid)){//分大了 r=mid; } else l=mid+1; } printf("%d\n",l); } return 0; }
• bool check(double x){ • int num=0; • for(int i=1;i<=n;i++)num+=(int)(a[i]/x); • if(num<f+1)return true; • return false; • }
• cust暑期训练--二分 poj 3273
• bool check(int x){ • int sum=0,num=0; • for(int i=1;i<=n;i++){ • sum+=a[i]; • if(sum>x)sum=a[i],num++; • } • num++; • if(num>m)return false; • return true; • }
二分查找算法
CUSTACM
• 复习二分法(高中)
• • • •
函数fx(x) f(a)*f(b)<0 答案一定在a b之间,继续二分 ①如果f[(a+b)/2]=0,该点就是零点。 如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点, (a+b)/2=>a,从①开始继续使用 • 如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点, (a+b)/2=>b,从①开始继续使用 •
• • • • • • • • • • • • • • • • • • •
int a[12]={1,7,9,10,23,99,890,999,1001,1004,12093,901123}; int bs(int n){ int l=0,r=11; while(l<=r){ int mid=(l+r)/2; if(a[mid]>n)r=mid-1; else if(a[mid]<n)l=mid+1; else return mid; } return -1; } int main() { int n; while(cin>>n){ cout<<bs(n)<<endl; } return 0; }
Hale Waihona Puke Baidu念
二分查找又称折半查找,优点是比较次数少,查找速 度快,平均性能好;其缺点是要求待查表为有序表, 且插入删除困难。因此,折半查找方法适用于不经常 变动而查找频繁的有序列表。
步骤:首先,假设表中元素是按升序排列,将表中间 位置记录的关键字与查找关键字比较,如果两者相等, 则查找成功;否则利用中间位置记录将表分成前、后 两个子表,如果中间位置记录的关键字大于查找关键 字,则进一步查找前一子表,否则进一步查找后一子 表。重复以上过程,直到找到满足条件的记录,使查 找成功,或直到子表不存在为止,此时查找不成功。