这道题算的上是今天看到的最简单的一道题了,
主要就是排列然后再查找
我的思路:
直接快排,然后暴力查找,但是时间效率实在太低了,足足是最快时间的50倍!!!
这道题目有几种优化方案,第一种就是排序以后剔除一下重复元素,再用二分查找.
第二种是排序后用哈希思想,可以使查找的时间复杂度达到O(1)
第三种是有大神讲不要排序只需要进行统计就行了。。。。。。。
下面的代码使用了哈希思想,时间效率较原来提高了一倍
代码如下:
//可以用二分优化,也可以用计数排序法
//还可以用哈希思想优化
#include<iostream>
#include<string.h>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10000+10],b[10000+10],c[10000+10];
int main()
{
int i,j,N,Q,cnt=0,num;
while(scanf("%d %d",&N,&Q)!=EOF)
{
cnt++;
if(!N&&!Q)
break;
memset(c,0,sizeof(c));
cout<<"CASE# "<<cnt<<":"<<endl;
for(i=1;i<=N;i++)
scanf("%d",&a[i]);
sort(a+1,a+N+1);
for(i=1;i<=N;i++)
{
int k2=a[i];
if(!c[k2])
c[k2]=i; //多个相同值,只记录第一个位置
}
int flag;
for(j=0;j<Q;j++)
{
scanf("%d",&num);
if(c[num])
cout<<num<<" found at "<<c[num]<<endl;
else
cout<<num<<" not found"<<endl;
}
}
return 0;
}