好久没写解题报告了因为做的题太水没学到什么,今天终于学到了新的知识,用快排加二分查找解决庞大的查找任务,对与新手来说刚开始接触这题应该没想到用二分查找的,我自己也是,直接写了一个简单的查找程序让他输出对应的english但是一放上去就超时了,后来要百度看别人的代码想想才知道原来这题考的就是要高效的查找,用普通查找办法也有一样的输出结果不过就是超时咯,不但学会了二分,还学了几个很有用的函数sscanf和bsearch,用bsearch就不用自己去写二分查找了,直接用就行了,
至于这题的转行判断也琢磨死人,最后才有了解决办法。。。辛苦学习写出的AC代码:
#include<iostream>
#include<string>
#include<stdio.h> //包含sscanf函数
#include<stdlib.h> //包含bsearch函数
using namespace std;
struct Dic
{
char engl[15];
char fore[15];
}dic[100005];
int cmp(const void *a,const void *b)
{
return strcmp(((Dic*)a)->fore,((Dic*)b)->fore);
}
int main()
{
Dic *p,key;
char str[30];
int i=0;
while(cin.getline(str,30),strlen(str)!=0)//为了想一个能输入字符串和回车的函数想了好久,之前用cin一直不把回车当回事
{
sscanf(str,"%s%s",dic[i].engl,dic[i].fore); //这个函数的功能是将空格前的一段字符付给engl,后段付给fore
i++;
}
qsort(dic,i,sizeof(Dic),cmp);
while(scanf("%s",key.fore)!=EOF)
{
p=(Dic*)bsearch(&key,dic,i,sizeof(Dic),cmp); //用besearch实现二分查找的功能
if(p)
cout<<p->engl<<endl;
else
cout<<"eh"<<endl;
}
return 0;
}
用快排加二分查找做这道题的基础是懂会用快排函数和二分查找就行了对于新手来说,对于bsearch自己也是刚百度学到的。
这里还有另一个比较好的代码,也是转载的
/*
Problem: 2503 User: lantianheyeqi
Memory: 2500K Time: 485MS
Language: C++ Result: Accepted
*/
#include"iostream"
#include"cstdio"
#include"cstring"
#include"cstdlib"
#include"algorithm"
#define N 100005
using namespace std;
typedef struct node
{
char english[12];
char foreign[12];
}point;
point data[N];
int number;
bool cmp(point x,point y)
{
int k=strcmp(x.foreign,y.foreign);
if(k>0) return false;
else return true;
}
void find(int left,int right,char* f)
{
int mid=(left+right)/2;
while(left<=right)
{
int k=strcmp(data[mid].foreign,f);
if(k>0) right=mid-1;
else if(k<0) left=mid+1;
else
{
printf("%s\n",data[mid].english);
return ;
}
mid=(left+right)/2;
}
printf("eh\n");
return ;
}
int main()
{
char e[12];
char f[12];
char ppp[30];
while(gets(ppp)&&ppp[0]!='\0')
{
sscanf(ppp,"%s%s",&e,&f);
number++;
strcpy(data[number].english,e);
strcpy(data[number].foreign,f);
}
sort(data+1,data+1+number,cmp);
while(gets(f))
{
find(1,number,f);
}
return 0;
}