Dzień dobry
Mam problem z poniższym zadaniem. Po wrzuceniu rozwiązania do sprawdzarki "themis" otrzymuje 12 sprawdzeń pozytywnych i 1 negatywne (time limit exceeded).
Treść zadania:
Problem code: PARTITION | Time: 2 s | Memory: 32 MB | Solved: no | print
Wielkie Klasowe Mistrzostwa W Bieganiu Za Piłką zbliżają się wielkimi krokami. Rywalizacja toczyć się będzie między Drużyną Michała i Drużyną Tych Drugich. W związku z niebagatlną rangą wydarzenia, obie drużyny wylewają z siebie ostatnie poty na treningach. Michał rozpoczyna każdy trening od przeglądu stanu osobowego drużyny. Z grubsza polega to na tym, że wszyscy jego zawodnicy mają ustwić się w szeregu. Zadanie to nie jest trudne, jednak Michał jest surowym i wymagającym kapitanem (a przy okazji skrytym milośnikiem informatyki, chociaż udaje, że wcale nie) i stawia swojej drużynie dodatkowy warunek: mają oni ustawić się od najniższego do najwyższego. W takich okolicznościach zawodnicy gubią się i patrzą na Michała tępo. Michał wskazuje zatem jednego z nich i wydaje następującą komendę: wszyscy niżsi mają stanąć przed wskazanym zawodnikiem, obok mają ustawić się wszyscy tak samo wysocy, a na końcu mają stanąć wszyscy wyżsi.
Mając dane początkowe ustawienie zawodników oraz numer zawodnika wskazanego przez Michała, wypisz jedno z możliwych końcowych ustawień.
Wejście
W pierwszej linii wejścia dane są liczby n oraz k (1 ≤ n ≤ 10^6, 1 ≤ k ≤ n) oznaczające liczbę zawodników w drużynie oraz numer wskazanego zawodnika. W drugiej linii danych jest n liczb nie większych od 10^6 – są to wzrosty kolejnych zawodników.Wyjście
Należy wypisać n liczb: wzrosty zawodników w szeregu po wykonaniu komendy Michała. W sytuacji, gdy możliwych jest wiele poprawnych odpowiedzi, należy wypisać dowolną z nich.Przykład
Dla danych wejściowych9 3
1 3 5 7 9 2 4 6 8
poprawną odpowiedzią jest
3 1 4 2 5 9 6 8 7
Mój kod:
#include <iostream>
using namespace std;
int ile_mniejszych(int arr[], int k, int n)
{
int licz = 0;
for(int i = 0; i<n; i++)
if(arr[i]<arr[k])
licz++;
return licz;
}
int ile_wiekszych(int arr[], int k, int n)
{
int licz = 0;
for(int i = 0; i<n; i++)
if(arr[i]>arr[k])
licz++;
return licz;
}
int ile_rownych(int arr[], int k, int n)
{
int licz = 0;
for(int i = 0; i<n; i++)
if(arr[i]==arr[k])
licz++;
return licz;
}
void ustaw(int arr[], int k, int n)
{
int wzrost = arr[k];
int poz = k;
int pozostali_nizsi = 0;
int pozostali_wyzsi = 0;
int pozostali_rowni = 0;
for(int i = 0; i<n; i++)
if(arr[i]<arr[k])
pozostali_nizsi++;
else if(arr[i]==arr[k])
pozostali_rowni++;
else if(arr[i]>arr[k])
pozostali_wyzsi++;
//int pozostali_nizsi = ile_mniejszych(arr,k,n);
//int pozostali_wyzsi = ile_wiekszych(arr,k,n);
//int pozostali_rowni = ile_rownych(arr,k,n);
int i = 0;
int pozycja= 0;
while(pozostali_nizsi>0)
{
if(arr[i]<wzrost)
{
swap(arr[i],arr[pozycja]);
pozycja++;
pozostali_nizsi--;
}
i++;
}
i = pozycja;
while(pozostali_rowni>0)
{
if(arr[i]==wzrost)
{
swap(arr[i],arr[pozycja]);
pozycja++;
pozostali_rowni--;
}
i++;
}
i = pozycja;
while(pozostali_wyzsi>0)
{
if(arr[i]>wzrost)
{
swap(arr[i],arr[pozycja]);
pozycja++;
pozostali_wyzsi--;
}
i++;
}
i = 0;
}
int main()
{
int n;
int k;
cin >> n >> k;
int arr[n];
k--;
for(int i = 0; i<n; i++)
cin >> arr[i];
ustaw(arr,k,n);
for(int i = 0; i<n; i++)
cout << arr[i] << " ";
}