Algoritmul, pas cu pas
Programul citește mai întâi și , apoi tratează separat fiecare cerință.
Cerința 1 — maximul din două cifre.
- Iau cifra unităților și cifra zecilor .
- Pot forma două numere de două cifre: și . Răspunsul e maximul lor.
Cerința 2 — prima apariție.
- Citesc și parcurg șirul. La prima valoare egală cu rețin poziția și mă opresc logic (sau ignor restul).
- Dacă nu apare deloc, răspunsul e .
Cerința 3 — penultima și ultima apariție.
- Parcurg șirul ținând două variabile:
ultima(ultima poziție pe care am văzut ) șipenultima(valoarea luiultimadinaintea actualizării). - Când găsesc pe poziția :
penultima = ultima, apoiultima = i. - La final, dacă apare o singură dată,
penultimarămâne ; dacă nu apare deloc, ambele sunt .
Cerința 4 — inversarea cifrelor impare.
- Transform în șir de cifre.
- Adun într-o listă cifrele impare, în ordinea apariției.
- Parcurg cifrele de la stânga la dreapta: cifrele pare rămân neschimbate, iar pe pozițiile cifrelor impare pun cifrele impare în ordine inversă (ultima impară pe prima poziție impară etc.).
Cifrele pare nu se mișcă deloc — se rearanjează doar cifrele impare între ele. Pe , cifrele impare devin , iar stă pe loc: rezultatul e .
Complexitatea e pentru cerințele cu șir și pentru celelalte — instantaneu pentru limitele date.
Soluția în C++
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
ifstream fin("numere.in");
ofstream fout("numere.out");
int main() {
int C;
long long X;
fin >> C >> X;
if (C == 1) {
// Cele două cifre + cele două numere de două cifre posibile
int u = X % 10; // unitățile
int z = (X / 10) % 10; // zecile
fout << max(u * 10 + z, z * 10 + u) << "\n";
} else if (C == 2 || C == 3) {
int N;
fin >> N;
int prima = 0, ultima = 0, penultima = 0;
for (int i = 1; i <= N; i++) {
long long v;
fin >> v;
if (v == X) {
if (prima == 0) prima = i; // prima apariție
penultima = ultima; // vechea ultimă devine penultima
ultima = i; // poziția curentă e noua ultimă
}
}
if (C == 2) fout << prima << "\n";
else fout << penultima << " " << ultima << "\n";
} else { // C == 4
string s = to_string(X);
// Adun cifrele impare în ordinea apariției
vector<int> impare;
for (char ch : s)
if ((ch - '0') % 2 == 1) impare.push_back(ch - '0');
// Le repun pe pozițiile impare, în ordine inversă
int k = (int)impare.size() - 1;
for (char &ch : s)
if ((ch - '0') % 2 == 1) ch = char('0' + impare[k--]);
fout << s << "\n";
}
return 0;
}Greșeli frecvente
- Confunzi cifra zecilor cu cifra unităților la cerința 1 — zecile sunt , nu (care ar da tot numărul fără ultima cifră).
- La cerința 3 resetezi greșit
penultima— trebuie să o setezi la vechea valoare a luiultimaînainte de a actualizaultima; altfel pentru o singură apariție nu obții0 p. - La cerința 4 muți și cifrele pare — cifrele pare rămân fixate pe pozițiile lor; doar cifrele impare se rearanjează între ele, în ordine inversă.