Răspuns :
#include <fstream>
#define NMAX 100001
#define LGMAX 20
using namespace std;
ifstream fin("cifre9.in"); ofstream fout("cifre9.out");
int n;
long long int smax;
int nr[LGMAX], s[LGMAX]; //nr[i]=numarul de numere cu i cifre
int nrc[10]; //nrc[i]=numarul de cifre i folosite in scrierea celor n numere
int v[NMAX][LGMAX],lg[NMAX];
int main()
{ int i, j, c, x, lgx;
fin>>n;
for(i=0;i<n;i++)
{ fin>>x;
lgx=0;
do {nrc[x%10]++; lgx++; x/=10;} while(x);
nr[lgx]++;
}
s[1]=1;
for(i=2;i<LGMAX;i++) s[i]=s[i-1]+nr[i-1];
//numerele de i cifre sunt plasate in v de la s[i] la s[i]+nr[i]-1;
//plasez zerourile necesare in numere de o cifra
for(i=1;i<=nr[1] && nrc[0]; i++) {nrc[0]--; lg[i]=1;}
//plasez celelalte zerouri in mod echilibrat, pana le epuizez
for(i=1;i<LGMAX-1;i++) //plasez zerouri pe pozitia i
{ if(!nrc[0]) break;
for(j=s[i+1]; j<=n && nrc[0]; j++) {lg[j]++; nrc[0]--;}
}
//distribui cifrele descrescator
c=9;
for(i=LGMAX-1;i>=0;i--) //plasez cifra c pe pozitia i in numerele pentru care exista cifra i disponibila
for(j=s[i];j<=n;j++)
{ while(!nrc[c]) c--;
if(lg[j]<i) {nrc[c]--; v[j][i]=c;}
}
//construiesc numerele si calculez suma
for(i=1;i<=n;i++) //construiesc numarul v[i]
{ lg[i]=0;
for(j=LGMAX-1;j;j--) lg[i]=lg[i]*10+v[i][j];
smax+=lg[i];
}
fout<<smax<<'\n';
for(i=1;i<=n;i++) fout<<lg[i]<<'\n';
fout.close(); return 0;
}
#define NMAX 100001
#define LGMAX 20
using namespace std;
ifstream fin("cifre9.in"); ofstream fout("cifre9.out");
int n;
long long int smax;
int nr[LGMAX], s[LGMAX]; //nr[i]=numarul de numere cu i cifre
int nrc[10]; //nrc[i]=numarul de cifre i folosite in scrierea celor n numere
int v[NMAX][LGMAX],lg[NMAX];
int main()
{ int i, j, c, x, lgx;
fin>>n;
for(i=0;i<n;i++)
{ fin>>x;
lgx=0;
do {nrc[x%10]++; lgx++; x/=10;} while(x);
nr[lgx]++;
}
s[1]=1;
for(i=2;i<LGMAX;i++) s[i]=s[i-1]+nr[i-1];
//numerele de i cifre sunt plasate in v de la s[i] la s[i]+nr[i]-1;
//plasez zerourile necesare in numere de o cifra
for(i=1;i<=nr[1] && nrc[0]; i++) {nrc[0]--; lg[i]=1;}
//plasez celelalte zerouri in mod echilibrat, pana le epuizez
for(i=1;i<LGMAX-1;i++) //plasez zerouri pe pozitia i
{ if(!nrc[0]) break;
for(j=s[i+1]; j<=n && nrc[0]; j++) {lg[j]++; nrc[0]--;}
}
//distribui cifrele descrescator
c=9;
for(i=LGMAX-1;i>=0;i--) //plasez cifra c pe pozitia i in numerele pentru care exista cifra i disponibila
for(j=s[i];j<=n;j++)
{ while(!nrc[c]) c--;
if(lg[j]<i) {nrc[c]--; v[j][i]=c;}
}
//construiesc numerele si calculez suma
for(i=1;i<=n;i++) //construiesc numarul v[i]
{ lg[i]=0;
for(j=LGMAX-1;j;j--) lg[i]=lg[i]*10+v[i][j];
smax+=lg[i];
}
fout<<smax<<'\n';
for(i=1;i<=n;i++) fout<<lg[i]<<'\n';
fout.close(); return 0;
}