二分搜索
题目描述
给定n个元素,使用二分法从中查找特地元素x。
输入
包含T组数据。先给定一个T。每组数据第一行是n,第二行是n个数。第三行为要查找的数x
T<2000,n<100000
输出
先输出排序后的数组。如果找到x,则输出x的位置;如果没找到,输出“-1”。
样例输入
1
11
60 17 39 15 8 34 30 45 5 52 25
17
样例输出
5 8 15 17 25 30 34 39 45 52 60
4
提示
#include<iostream> #include<algorithm> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; int a[100005]; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); int x; cin>>x; int l=1,r=n; int mid; while(l<=r) { mid=(l+r)/2; if(a[mid]<x) { l=mid+1; } else if(a[mid]>x){ r=mid-1; } else{ l=mid; break; } } for(int i=1;i<=n;i++) { if(i!=n) cout<<a[i]<<" "; else cout<<a[i]<<endl; } if(a[l]==x) cout<<l<<endl; else cout<<-1<<endl; } return 0; }
或者
#include<iostream> #include<algorithm> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; int a[100005]; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1); int x; cin>>x; int l=1,r=n; int mid; while(l<=r) { mid=(l+r)/2; if(a[mid]<x) { l=mid+1; } else if(a[mid]>x){ r=mid-1; } else{ r=mid; break; } } for(int i=1;i<=n;i++) { if(i!=n) cout<<a[i]<<" "; else cout<<a[i]<<endl; } if(a[r]==x) cout<<r<<endl; else cout<<-1<<endl; } return 0; }
大千世界中,万物皆有时节
心里健康基本要素
不带评论的观察是人类智力的最高形式
《七律·人民解放军占领南京》
《最好的防御就是进攻》-- 向任总汇报无线业务会议纪要 2013年9月5日
《深淘滩,低作堰》-- 任正非在运作与交付体系奋斗表彰大会上的讲话 2009年4月24日
《市场经济是最好的竞争方式,经济全球化是不可阻挡的潮流》-- 任正非在财经系统表彰大会上的讲话 2009年3月24日
《开放、妥协与灰度》-- 任正非在2009年全球市场工作会议上的讲话 2009年1月15日
《让青春的火花,点燃无愧无悔的人生》-- 任正非在无线产品线奋斗大会上的讲话纪要 2008年5月31日