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 }

 

posted @ 2012-03-07 10:05  笑巧  阅读(796)  评论(0编辑  收藏  举报