POJ2503(二分查找)

题意:就像查找一本字典,根据输入的条目和要查询的单词,给出查询结果(每个单词长度不超过10),所查单词数不超过100 000.

解题思路:由于数据量很大,即使我用了scanf 和 printf 还是会超时。所以如果依次遍历要查找的单词速度很慢。后来发现用二分查找就很容易,但要二分必须对单词进行排序,故用到了标准库函数qsort进行快速排序。

另外,对于数据输入需要特别注意,以前遇到过类似的情况,所以就学会了应用peek() 函数。函数peek()用于输入流中,并返回在流中的下一个字符或如果是处于被入的文件的结尾处返回EOF,peek()不会把字符从流中移除。所以必须用getchar() 来消除换行符。

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<stdlib.h> // 快速排序的标准库函数qsort的头文件
 4  #include<cstring>
 5  using  namespace std;
 6  #define MAX 100005
 7  struct word{
 8      char str1[ 15],str2[ 15];
 9 }w[MAX];
10 
11  int n= 0;
12  int cmp( const  void *a, const  void *b)
13 {
14      return strcmp((*(word *)a).str2,(*(word *)b).str2);
15 }
16 
17  int Search( char str[])
18 {
19      int t,mid,low= 0,high=n- 1;
20      while(low<=high)
21     {
22         mid=(low+high)/ 2;
23         t=strcmp(w[mid].str2,str);
24          if(t== 0return mid;
25          else  if(t==- 1
26             low=mid+ 1;
27          else 
28             high=mid- 1;
29     }
30      return - 1;
31 }
32 
33  int main()
34 {
35      char str[ 20];
36      int k,f= 1;
37      while(f)
38     {
39         cin>>w[n].str1>>w[n].str2;
40         n++;
41         getchar();  // 移除换行符
42           // 函数peek()用于输入流中,并返回在流中的
43           // 下一个字符,peek()不会把字符从流中移除
44           if(cin.peek()== ' \n ') f= 0;
45     }
46     qsort(w,n, sizeof(word),cmp);
47      while(cin>>str)
48     {
49         k=Search(str);
50          if(k==- 1) cout<< " eh "<<endl;
51          else cout<<w[k].str1<<endl;
52     }
53      return  0;
54 }

 

你可能感兴趣的:(二分查找)