Eu ma refer la situatia cand sunt in timpul unui concurs si nu gasesc un algoritm eficient pentru rezolvarea unei probleme. In acest caz voi incerca sa gasesc solutii pentru problema pana cand timpul maxim de executie admis se apropie de sfarsit, moment in care returnez cea mai buna solutie care am gasit-o pana atunci. Pentru acest caz, in Turbo Pascal utilizam:
const maxt=0.95;
var t2:longint absolute $0000:$046c;
t1:longint;
begin
t1:=t2;
while (t2-t1)/18.2<maxt do
begin
{caut solutie}
end;
{afisez solutia cea mai buna gasita}
end.
{solutia este furnizata in maxim 0.95 secunde (timpul maxim admis)}
Problema in Free Pascal este ca nu pot declara variabila t2 pentru ca primesc eroare la compilare. Si atunci ar trebui sa folosesc o functie sau o procedura dintr-o unitate. Folosind gettime din unitatea DOS mi se pare mai putin eficient deoarece trebuie efectuate destule calcule pentru a afla timpul trecut intre doua momente de timp. Adica in Turbo Pascal aflam numarul de tacti care daca ii impart la 18.2 obtin numarul de secunde trecute (aproximativ), dar cu procedura gettime trebuie efectuate mai multe calcule. Sau daca utilizez SysUtils :
uses sysutils;
const maxt=990;
var start,stop:TTimeStamp;
begin
start:=DateTimeToTimeStamp(now);
repeat
// continuare cautare solutie
stop:=DateTimeToTimeStamp(now);
until stop.time-start.time>maxt;
// afisare solutia cea mai buna
end.
{solutia este furnizata in maxim 990 milisecunde (timpul maxim admis)}
pot sa fac aceasta verificare, dar nu stiu cat de rapid lucreaza functia DateTimeToTimeStamp() si, ce e cel mai important, nu stiu daca la concursuri avem voie sa utilizam astfel de unit-uri.
Prin urmare, as vrea sa stiu care este cea mai buna metoda sa rezolv in Free Pascal o astfel de problema in timpul unui concurs!