uva--10474-- Where is the Marble?

这道题算的上是今天看到的最简单的一道题了,

主要就是排列然后再查找

我的思路:

直接快排,然后暴力查找,但是时间效率实在太低了,足足是最快时间的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;
}


你可能感兴趣的:(排序,查找,uva,哈希思想)