W oparciu o twoje rady opracowalem juz kilka programów, jednak żaden z nich nie zadziałał wstarczająco szybko, dla wymogów tego zadania.
Wklejam tutaj to, co wydaje mi się najlepszym z wymyślonych przezemnie sposobów. Nie mam za bardzo pomysłu co jeszcze może być tutaj za wolne. Miałem też zalążek pomysłu z rekurencją, ale narazie stanąłem tam w martwym punkcie.
#include <iostream>
#include <string>
using namespace std;
char kolej[1000000];
int main()
{
int ile_powtorzen;
cin>>ile_powtorzen; //wybieramy iloscpowtorzen i rozpoczyna sie petla ktora wykona wczytywania
for(int i=1; i<=ile_powtorzen; i++)
{
char *ok_kolej;
ok_kolej = new char[1000000]; //za pomoca wskaznika deklarujemy robocza tabele char
cin>>kolej; //wprowadzamy pierwotna kolejke
int ile=0;
while(kolej[ile]!=NULL) ile++; //int ile jest licznikiem w petli okreslajacej dlogosc pierwotnej kolejki
char przod=kolej[ile-1]; //okreslamy robocza zmienna przod
int bufor=0; //bufor jest licznikiem do pracy i zapisu w roboczej tabeli ok_kolej
for(int j=ile-2; j>=0; j--) //petla rozpoczyna od tylu do przodu kolejki
{
if((int)kolej[j]>=(int)przod) //to wyrazenie szuka danej litery, ktora bedzie wieksza od aktualnego przodu
{
ok_kolej[bufor]=przod; //jezeli znajdzie taka litere to wpisuje aktualny przod do ok_kolei
przod=kolej[j]; //a potem znaleziona wieksza litera staje sie przodem
bufor++; //bufor jest powiekszany
}
}
ok_kolej[bufor]=przod; //jezeli porownanie dotarlo do konca ozancza to ze aktualny przod jest najwiekszy i powinien wyladaowac w ok_kolei
ok_kolej[bufor+1]=NULL; //dodajemy na koncu ok_kolei NULL, dla zachowania zasad STRING (nie wiem czy to potrzebne)
for(int j=bufor; j>=0; j--) cout<<ok_kolej[j]; //nalezy odwrocic kolej tak by najwieksze litery znalazly sie na poczatku, a nie na koncu
cout<<endl;
delete [] ok_kolej; //robocza ok_kolej jest usuwana z pamieci przed powtorzeniem petli
}
return 0;
}
Dzisiaj nie będę miał czasu, ale to co zauważyłem. Tablica kolej jest globalna, a powinno się unikać wszelkich zmiennych globalnych, chyba, że nie mamy wyjścia lub wiemy co robimy [wiemy że to zło, ale się z tym godzimy w imię innych wyższych celów ]
Ok_kolej mogłaby być zadeklarowana identycznie i tylko raz, nie widzę tu sensu tworzenia jej dynamicznie w środku pętli - tym bardziej, że i tak wstawiasz za każdym razem na sztywno stałą wartość. Pomyśl, czy nie można [efektywnie] użyć tylko jednej tablicy, podobnie jak w początkowym pomyśle, ale bez erase.
Na razie tyle.
Dzień dobry, ja tutaj z pytaniem odnośnie treści bo nie wiem czy ją rozumiem.
więc od najsilniejszego idziemy od 'z' do 'a', następnie wiadomo, że 'a' > 'A'.
Skąd wiadomo czy 'a' > 'Z'? albo 'a'<'Z', skoro małe 'z' jest > 'a' to duże 'Z' > 'A' ?
Dlaczego nie jest treść sprecyzowana?
Jakby było napisany 'a' > 'Z' to by wszystko było jasne, (bo zakładamy, że 'Z' > 'A')
Z przykładu i treści zadania.
Przyznaję, że można było doprecyzować specyfikację zadania. Niemniej ja dostałem AC za pierwszym razem, a opierałem się wyłącznie na treści zadania. 305 AC też o czymś świadczy więc nie jest źle.
Nie byłoby jasne. Ktoś zacząłby się zastanawiać, dlaczego w przykładzie są ciągi literek typu: "klKKnNLlNL", skoro w treści opisano jedynie literki a, A, z oraz Z.
A teraz wisienka na torcie
Bo nie jest
Swojego czasu też męczyłem się z jakimś zadaniem, którego nie rozumiałem. Oczywiście część zadań ma to do siebie, że ich treść dociera do ludzi dopiero po otrzymaniu baaaardzo dokładnych wskazówek, niemalże gotowca - kwestia tak zwanego "nie nadawania na tych samych falach". To zadanie jednak do nich się nie zaliczało - po rozwiązaniu go dalej uważałem, że treść wprowadza w błąd. Swoje zastrzeżenia przedstawiłem na forum, gdzie nikt nie zaprzeczał moim tezom, ale mimo to ludzie (jak pamiętam głównie @narbej) stawali po stronie autora i uważali moje podejście za czepialstwo. Oczywiście nie przemawiała do mnie taka argumentacja...
Aż tu nagle ktoś (niestety nie pamiętam kto) na moje twierdzenie, iż specyfikacja powinna być dokładna, odpowiedział coś w rodzaju (przekazuję sens wypowiedzi, a nie słowa): "Powinna, ale w praktyce zawsze specyfikacja nie jest dokładna, stanowi pewne przybliżenie i trzeba się domyślać co autor zadania/klient/prowadzący laboratoria ma na myśli mając jedynie pewien ramowy szkic oraz modyfikować specyfikację adekwatnie do napotkanych trudności programistycznych i humorów autora zadania/klienta/prowadzącego".
Radzę zapamiętać i kombinować aż do skutku przy każdym kontakcie z programowaniem, nawet na SPOJu
Otrzymuję TLE (przekroczono limit czasu).
Na początku zrobiłem na cin, cout i faktycznie - mogło przekroczyć limit, ale gdy przeszedłem na scanf i printf i nadal wyświetla, że przekroczono... no to już więcej nie zrobię.
Co jest nie tak?
kodzik:<=Kiedyś był tu ze wskaźnikami =>
zadanie: http://pl.spoj.com/problems/AL_01_02/14
PS
Czy to przez to, że wskaźniki są za wolne?
Najpierw zrób zadanie, a nie z góry obstawiaj
Nie tylko w języku c/c++ napis 'a' ma konkretne znaczenie, dla każdego trochę bardziej zaawansowanego [kumatego] programisty oczywiste.
Wystarczy[łoby] mieć tablicę kodów ASCII pod ręką i od czasu do czasu do niej zaglądnąć. i tylko tyle
Zgoda, ale jest też 618 [na razie ] TLE i tylko 122 osób, które mogły wysłać więcej niż jedno AC - stąd te 305. W końcu zadanie jest nie bez powodu w kategorii zadań średnich, a nie łatwych.
Też zrobiłem na cin, cout + ios::sync_with_stdio(0) ===> AC czas 1.26
90 linijek to kodzik? [ok 20 linijek kodziku w zupełności wystarczyłoby]
Dlatego trudno to analizować.
Niee, to przez programistę, bo to od niego zależy co z tym [ze wskaźnikami] zrobi.
PS
Musisz przemyśleć i skrócić kod - nic tu raczej nie da się zrobić i wymyśleć. Przy okazji przemyśl taką swoją dziwną konstrukcję:
if(p)
{
while(p)
{
...
Oczywiście wątpię, czy jej poprawienie spowoduje cudowne nie TLE
PS 2
Nie rozumiem też twojego sposobu pisania main(). Przecież wszyscy wiedzą, że prawidłowo [ale też bez wpływu na TLE] powinno się pisać:
int main(){
starter();
}
i tyle , bez zbędnych śmieci w main().
Yyyy... to będę chamem. A co z x? A < Z < a < z .... a x? x < A < Z < a < z czy A < x < Z < a czy...?
Jak wielu.
Widocznie zły algorytm...
Yyyy... jestem wróżbitą
Tak i nie, a ściślej: dzięki @narbej za odpowiedź
Mógłbym znowu wykazać się "czepialstwem" i podać przykłady zadań łatwych z dużo gorszymi wynikami, ale oczywiscie rozumiem sens wypowiedzi i zgadzam się z nim.
W każdym razie w matematyce zaprzeczeniem kwantyfikatora ogólnego jest kwantyfikator szczegółowy. A w tym przypadku nie tylko istnieje osoba, która to zrozumiała, ale aż 305 osób ogarnęło to zadanie Nota bene jedno z moich ulubionych
PS
@i6g7g6y5 jeżeli nie masz pomysłu to ewentualnie możesz przeszukać moje ostatnie posty... pisałem komuś o zadaniu ze zwierzakami ustawiającymi się w kolejce Bardzo możliwe, że padło tam słowo kluczowe do uzyskania AC
(ale nie gwarantuję!)
Nie miałeś tłumaczyć, ale przemyśleć i przestać stosować.
Powtórzę
Zamiast:
if(p)
while(p)
wystarczy aż nadto
samo
while(p)
.
.
Warto jeszcze, żeby jedna z tych ogarniających osób [dużo mniej niż 305], nauczyła się prawidłowo czytać i interpretować dane - wystarczy tylko przeczytać uważnie nagłówki rubryk no i niestety trochę pomyśleć.
to zadanie jest łatwe, pomijając fakt, że jego nazwa kieruje znaczna część rozwiązujących w złą stronę
to że zadziwiająco mało osób rozwiązało to zadanie, to raczej spowodowane jest tym, że już wtedy spoj miał znacznie mniejszą popularność niż na początku działalności - ale i tak zadanie ma znacznie więcej rozwiązań, niż inne średnie zadania z tego okresu