Se dă un șir a1, a2, …, an de numere întregi. Se dau de asemenea numerele întregi x și k. Să se determine:
a) Cea mai din stânga poziție p din șir cu a[p] = x
b) Cea mai din dreapta poziție q din șir cu a[q] = x
c) Poziția r a celei de-a k-a apariții a lui x în șir.
Programul citește de la tastatură numărul n, iar apoi n numere întregi, separate prin enter, reprezentând elementele șirului. În final, de pe ultimele două linii, se citesc numerele x și k.
Programul va afișa pe ecran, separate prin enter, valorile p, q și r. Dacă x nu apare în vector, atunci p și q vor fi egale cu 0, iar dacă x nu apare de cel puțin k ori, atunci r va fi 0.
toate numerele citite la intrare sunt cuprinse între -1.000 și 1.000 și n și k sunt numere naturale nenule
Date intrare:
4
1
2
1
2
1
4
Date iesire:
1
3
0
(Este problema 4037 pe pbinfo) Multumesc anticipat!!
Răspunsuri la întrebare
Răspuns:
#include <iostream>
using namespace std;
int v[100001]; // nu precizeaza cat de mare este vectorul, deci am ales eu o valoare
int main()
{
unsigned int n;
cin >> n;
int x, k;
for (int i = 1; i <= n; ++i)
cin >> v[i];
cin >> x >> k;
int st, dr; // cea mai din stanga, respectiv dreapta pozitie a lui x
st = dr = 0; // initializam 0, "Dacă x nu apare în vector, atunci p și q vor fi egale cu 0"
for (int i = 1; i <= n / 2; ++i)
{
if (v[i] == x)
{
st = i;
break;
}
}
for (int i = n; i >= n / 2; --i)
{
if (v[i] == x)
{
dr = i;
break;
}
}
int cnt = 0, poz = 0; // contor pentru a afla la a cata aparietie a lui x suntem, respectiv a k - a pozitie a lui x
for (int i = 1; i <= n; ++i)
{
if (v[i] == x)
cnt++; // am gasit o aparitie
if (cnt == k)
{
poz = i; // pozitia devine pozitia curenta
break; // am gasit ce trebuia, ne oprim
}
}
cout << st << '\n' << dr << '\n' << poz;
return 0;
}
Explicație:
Ai explicatia in cod, probabil nu este cel mai eficient, dar este cel mai usor de inteles dupa parerea mea. Succes !!!