Răspuns :
#include <iostream>
using namespace std;
int main(){
int n, copie, maxim=0,ap=1;
//Citim n si ii facem o copie
cin >> n;
copie = n;
//Determinam cifra maxima din numar si numarul de aparitii
while(n>0){
//Daca ultima cifra e mai mare decat maxim, atunci ultima cifra devine maxim
if(n%10>maxim) maxim = n%10;
//Daca e egala, atunci incrementam numarul de aparitii
else if(n%10==maxim)ap++;
//Treci la urmatoarea cifra
n=n/10;
}
//Construim in inv - rasturnatul numarului cautat (copiem toate cifrele, mai putin cifra cu valoarea maxima)
n = copie;
int inv=0;
while(n){
//Daca cifra e diferita de valoarea maxima adauga la sfarsitul lui inv
if(n%10 != maxim) inv = inv*10 + n%10;
//Altfel decrementeaza numarul de aparitii. Daca numarul de aparitii ajunge la 0 nu adauga cifra.
//Putem sterge o singura aparitie a cifrei. Pentru a garanta ca numarul ce rezulta este cel mai mic trebuie ca aparitia stearsa de noi sa fie cea mai din fata a numarului( procesand numarul de la sfarsit spre inceput, asta inseamna ultima aparitie)
else{
ap--;
if(ap) inv = inv*10 + n%10;
}
//Treci la cifra urmatoare
n=n/10;
}
//Construieste inversa lui inv in n (adica numarul cautat de noi)
while(inv){
n=n*10+inv%10;
inv = inv/10;
}
//Afiseaza rezultatul
cout << n;
}