二分查找小小总结
2013-11-13 20:37
288 查看
以nyoj 904 search为例
题目连接:点击打开链接
二分查找,找序列里固定积分,相同积分输出前者。以前见到的就是顺序序列里没有重复的元素。
一、序列中没有相同的元素。代码:
第一,输出前面的符合元素。
第二,输出后面的符合元素。
这道题的代码:
题目连接:点击打开链接
二分查找,找序列里固定积分,相同积分输出前者。以前见到的就是顺序序列里没有重复的元素。
一、序列中没有相同的元素。代码:
int binary_search(int key) { int left=0,right=n-1; while(left<=right) { int mid=(left+right)/2; if(a[mid]>key) right=mid; else if(a[mid]==key) return key; else left=mid+1; } }二、序列中有相同的元素。
第一,输出前面的符合元素。
int binary_search(int key) { int left=0,right=n; while(left<right) { int mid=(left+right)/2; if(s[mid].num>=key) right=mid; else left=mid+1; } return left; }
第二,输出后面的符合元素。
int binary_search(int key) { int left=0,right=n-1; while(left<right-1) { int mid=(left+right)/2; if(a[mid]<=key) left=mid; else right=mid; } if(a[right]==key) return right; else if(a[left]==key) return left; }百度了一下,真有人总结。你真的回二分查找吗?
这道题的代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=10005; const int Max_Name=15; int n,m; struct Stu { char name[Max_Name]; int num; }s ; bool cmp(Stu a,Stu b) { if(a.num<b.num) return true; return false; } int search(int ans) { int left=0,right=n; while(left<right) { int mid=(left+right)/2; if(s[mid].num>=ans) right=mid; else left=mid+1; } return left; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); getchar(); for(int i=0;i<n;i++) { scanf("%s%d",s[i].name,&s[i].num); getchar(); } stable_sort(s,s+n,cmp); for(int i=1;i<=m;i++) { int ans; scanf("%d",&ans); printf("%s\n",s[search(ans)].name); } } return 0; }多总结,多进步。