Zadanie SPOJ. Kłopot z warunkiem dla else. Sprawdzenie całego programu.

0
#include<stdio.h>
#include<stdlib.h>	
					
int main()
{
	int tab[10000],i,ile,j,k,rozmiar=1,l=1;
	for (i=0; i<10000;i++)
	{   
	    scanf("%d",&tab[i]);
		if (tab[i]==-1) break;
		else rozmiar++;
	}
	printf("\n");
	scanf("%d",&ile);
	int tab2[ile];
	printf("\n");
	for (j=0; j<ile; j++)
	scanf("%d",&tab2[j]);
		printf("\n");
		for (k=0; k<j; k++)
			for (i=0; i<rozmiar; i++)
				if (tab[i]==tab2[k])
					printf("%d\n",i);
			    /*else
			    l++;
		 if(l/ile==rozmiar)
		 printf("%d\n",-1);*/	    
	
	return 0;

Zadanie.

http://pl.spoj.com/WSDOCPP/problems/PLINZWRT/

Witam,

Mam problem z warunkiem dla elsa by nie powtarzał każdej "-1" w pętli a wypisał ją tylko raz w przypadku gdy nie znajdzie liczby w tablicy.W komentarzu miałem pomysł taki by zwiększał zmienna "l" gdy nie znajdzie porównywanej liczby, wtedy jeżeli w całej pętli nie znajdzie to wartość "l" będzie równa "rozmiar" , pomysł działał jedynie w niektórych przypadkach np. w przykładzie ze SPOJ'a, więc się nie nadaje.

Nie jestem pewny też czy cała pętla jest dobrze napisana, także proszę o rady.

1
int indexOf(int tab[], int tabSize, int x) {
    int result  = -1;
    for (int i=0; i<tabSize; i++) {
        if (tab[i]==x) {
             result = i;
             break;
        }
    }
    return result;
}
1
#include <stdio.h>
 
int main()
  {
   static int tab[10000];
   int cnt=0,val,i,n;
   while((scanf("%d",&val))&&(val!=-1)) tab[cnt++]=val;
   scanf("%d",&n);
   whie(n--)
     {
      scanf("%d",&val);
      i=0;
      while((i<cnt)&&(tab[i]!=val)) ++i;
      printf("%d\n",i<cnt?i:-1);
     }
   return 0;
  }
1
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
template <class T>
class mypair {
public:
  T index;
  T value;
  mypair() {}
  mypair(T __x, T __y)
    : index(__x)
    , value(__y) {}
};
template <class T>
bool comp(mypair<T> a, mypair<T> b) {
  return a.value < b.value;
}

void szukaj(vector <mypair<int> > &vec, mypair<int>T[], const size_t n) {
  int *results = new int[n];
  for(unsigned v = 0, t = 0; v < vec.size(); ++v) {
    if(vec[v].value == T[t].value)
      results[T[t++].index] = vec[v].index;

    else if(vec[v].value > T[t].value)
      results[T[t++].index] = -1;
  }
  for(unsigned i = 0; i < n; ++i)
    cout<<results[i]<<' ';
  delete[] results;
}

int main() {
  int a = 0;
  std::vector <mypair<int> > vec;
  for(unsigned i = 0; cin>>a, a != -1; ++i)
    vec.push_back(mypair<int>(i, a));
  
  sort(vec.begin(), vec.end(), comp<int>);
  unsigned n;
  cin>>n;
  mypair<int> *T;
  T = new mypair<int>[n];
  for(unsigned i = 0; i < n; ++i)
  {
    cin>>T[i].value;
    T[i].index = i;
  }
  sort(T, T+n, comp<int>);
  szukaj(vec, T, n);
  delete[] T;
  return 0;
}

Rozwiązanie optymalne w czasie 2log(n) + n zamiast nlog(n) + log(n), jednak nie ręcze za to, moze miec bugi ;p

1 użytkowników online, w tym zalogowanych: 0, gości: 1