Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8.
Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
#include <stdio.h>
long tab[300001], n, krotnosci[31], powtorzenia[10001], licz_powt=0;
long start,koniec,pom,odp[300001];
int SORT_tab(int pocz,int kon) //Przepisane z Cormena
{
int sx,sq,si,sj,pom;
if(pocz<kon)
{
sx = tab[kon];
si=pocz-1;
for(sj=pocz;sj<=kon-1;sj++)
{
if (tab[sj]<sx)
{
si++;
pom=tab[si]; tab[si]=tab[sj]; tab[sj]=pom;
}
}
pom=tab[si+1]; tab[si+1]=tab[kon]; tab[kon]=pom;
sq=si+1;
SORT_tab(pocz,sq-1);
SORT_tab(sq+1,kon);
}
return 0;
}
/*int SORT_powtorzenia(int pocz,int kon) //Przepisane z Cormena
{
int sx,sq,si,sj,pom;
if(pocz<kon)
{
sx = powtorzenia[kon];
si=pocz-1;
for(sj=pocz;sj<=kon-1;sj++)
{
if (powtorzenia[sj]<sx)
{
si++;
pom=powtorzenia[si]; powtorzenia[si]=powtorzenia[sj]; powtorzenia[sj]=pom;
}
}
pom=powtorzenia[si+1]; powtorzenia[si+1]=powtorzenia[kon]; powtorzenia[kon]=pom;
sq=si+1;
SORT_powtorzenia(pocz,sq-1);
SORT_powtorzenia(sq+1,kon);
}
return 0;
}
*/
int main()
{
scanf("%ld",&n);
for (int ii=1; ii<=n; ii++) scanf("%ld",&tab[ii]);
SORT_tab(1,n);
// Teraz maj�c posortowan� tablic�, musz� policzy� powt�rzenia.
// Je�li powt�rzenia s� od 1 do 30, to wpisuj� w krotno�ci
for (int ii=1; ii<=30; ii++) krotnosci[ii]=0;
for (int ii=1; ii<=n; ii++) odp[ii]=0;
start = 1;
while (start<=n)
{
koniec=start;
while (tab[koniec+1] == tab[koniec]) koniec++;
pom=koniec-start+1;
if(pom <= 30) krotnosci[pom]++;
else { licz_powt++; powtorzenia[licz_powt]=pom; }
start=koniec+1;
}
// SORT_powtorzenia(1,licz_powt); // Zb�dne :)
// Mam posortowane powt�rzenia
// for (int ii=1; ii<=10; ii++) printf("krotnosci[%ld] = %ld\n", ii, krotnosci[ii]);
// for (int ii=1; ii<=licz_powt; ii++) printf("powt[%ld] = %ld\n",ii,powtorzenia[ii]);
// Dla ka�dego powt�rzenia dodaj� do tabeli odp. wynik dzielenia (powtorzenia przez pozycja).
// W przypadku krotno�ci mo�na to przyspieszy�.
for (int ii=1; ii<=30; ii++) for (int jj=1; jj<=ii; jj++) odp[jj] += int(ii/jj) * krotnosci[ii];
for (int ii=1; ii<=licz_powt; ii++) for (int jj=1; jj<=powtorzenia[ii]; jj++) odp[jj] += int(powtorzenia[ii]/jj);
for (int ii=1; ii<=n; ii++) printf("%ld ",odp[ii]*ii);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <stdio.h> long tab[300001], n, krotnosci[31], powtorzenia[10001], licz_powt=0; long start,koniec,pom,odp[300001]; int SORT_tab(int pocz,int kon) //Przepisane z Cormena { int sx,sq,si,sj,pom; if(pocz<kon) { sx = tab[kon]; si=pocz-1; for(sj=pocz;sj<=kon-1;sj++) { if (tab[sj]<sx) { si++; pom=tab[si]; tab[si]=tab[sj]; tab[sj]=pom; } } pom=tab[si+1]; tab[si+1]=tab[kon]; tab[kon]=pom; sq=si+1; SORT_tab(pocz,sq-1); SORT_tab(sq+1,kon); } return 0; } /*int SORT_powtorzenia(int pocz,int kon) //Przepisane z Cormena { int sx,sq,si,sj,pom; if(pocz<kon) { sx = powtorzenia[kon]; si=pocz-1; for(sj=pocz;sj<=kon-1;sj++) { if (powtorzenia[sj]<sx) { si++; pom=powtorzenia[si]; powtorzenia[si]=powtorzenia[sj]; powtorzenia[sj]=pom; } } pom=powtorzenia[si+1]; powtorzenia[si+1]=powtorzenia[kon]; powtorzenia[kon]=pom; sq=si+1; SORT_powtorzenia(pocz,sq-1); SORT_powtorzenia(sq+1,kon); } return 0; } */ int main() { scanf("%ld",&n); for (int ii=1; ii<=n; ii++) scanf("%ld",&tab[ii]); SORT_tab(1,n); // Teraz maj�c posortowan� tablic�, musz� policzy� powt�rzenia. // Je�li powt�rzenia s� od 1 do 30, to wpisuj� w krotno�ci for (int ii=1; ii<=30; ii++) krotnosci[ii]=0; for (int ii=1; ii<=n; ii++) odp[ii]=0; start = 1; while (start<=n) { koniec=start; while (tab[koniec+1] == tab[koniec]) koniec++; pom=koniec-start+1; if(pom <= 30) krotnosci[pom]++; else { licz_powt++; powtorzenia[licz_powt]=pom; } start=koniec+1; } // SORT_powtorzenia(1,licz_powt); // Zb�dne :) // Mam posortowane powt�rzenia // for (int ii=1; ii<=10; ii++) printf("krotnosci[%ld] = %ld\n", ii, krotnosci[ii]); // for (int ii=1; ii<=licz_powt; ii++) printf("powt[%ld] = %ld\n",ii,powtorzenia[ii]); // Dla ka�dego powt�rzenia dodaj� do tabeli odp. wynik dzielenia (powtorzenia przez pozycja). // W przypadku krotno�ci mo�na to przyspieszy�. for (int ii=1; ii<=30; ii++) for (int jj=1; jj<=ii; jj++) odp[jj] += int(ii/jj) * krotnosci[ii]; for (int ii=1; ii<=licz_powt; ii++) for (int jj=1; jj<=powtorzenia[ii]; jj++) odp[jj] += int(powtorzenia[ii]/jj); for (int ii=1; ii<=n; ii++) printf("%ld ",odp[ii]*ii); return 0; } |
English