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; } |