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==0) return 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 }
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==0) return 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 }