I have a problem from UVA online judge here. I have read it tons of times, and as they said, I have to get the answer really fast.
I have used a binary search and std::sort
, but I am still having a time error. I don't know any faster way of searching on an array other than binary search.
Any feedback please?
#include <stdio.h>
#include <string>
#include <algorithm>
int n,q,vec[100000];
int inicio,final,medio,busca;
int cont;
int busquedabinaria()
{
//busqueda binaria
std::sort(vec,vec+n);
inicio=0;
final=n-1;
medio=(inicio+final)/2;
while(inicio<=final)
{
if(vec[inicio]==busca)
return inicio;
if(vec[medio]==busca)
return medio;
if(vec[final]==busca)
return final;
medio = (inicio + final) / 2;
if (vec[medio] > busca)
final = medio - 1;
else if (vec[medio] < busca)
inicio = medio + 1;
// found
}
return -1;
}
int main()
{
freopen("in.txt", "rt",stdin);
freopen("out.txt", "wt",stdout);
while (scanf("%d %d\n",&n,&q)!=EOF && (n!=0 || q!=0) )
{
for (int i=0;i<n;i++)
{
scanf("%d\n",&vec[i]);
}
printf("CASE# %d:\n",cont+1);
cont++;
while(q--)
{
scanf("%d\n",&busca);
int res=busquedabinaria();
if(res!=-1)
{
while (vec[res-1]==busca && res>0)
{
res--;
}
printf("%d found at %d\n",busca,res+1);
}
else
printf("%d not found\n",busca);
}
}
return 0;
}
1 9999999
this technique will be infinitely quicker than a brute force approach. \$\endgroup\$