#include #define INFILE "furnici.in" #define OUTFILE "furnici.out" #define MaxF 1000000 + 1 #define MaxLoc 1000000 + 1 #define Infinit 1000000000 int l, m, n, nr_loc; int loc[MaxLoc]; int maxL, maxR; int rez=Infinit; void citire (void) { FILE *fin; int i, time; fin=fopen (INFILE, "r"); fscanf (fin, "%d %d", &l, &nr_loc);//lungime tunel si numar locuri speciale for (i=1; i<=nr_loc; i++) fscanf (fin, "%d", loc+i); fscanf (fin, "%d", &m); //cate furnici intra prin stanga maxL=0; //ultimul moment la care o furnica intra prin stanga maxR=0; //ultimul moment la care o furnica intra prin dreapta for (i=1; i<=m; i++) //retin timpul cand ultima furnica intra prin stanga { //restul nu intereseaza fscanf (fin, "%d", &time); if (time>maxL) maxL=time; } fscanf (fin, "%d", &n); //cate furnici intra prin dreapta for (i=1; i<=n; i++) //retin timpul cand ultima furnica intra prin dreapta { //restul nu intereseaza fscanf (fin, "%d", &time); if (time>maxR) maxR=time; } loc[0]=0; //primul loc special este 0 (intrarea din stanga) loc[nr_loc+1]=l; //ultimul loc special este l (intratrea din dreapta) fclose (fin); } void comb(void) { int i; int st, dr, poz; //nu ne intereseaxa decat ultimele furnici care intra in tunel prin stanga si prin dreapta //deci pentru aceste doua furnici se face calculul timpului for (i=0; i<=nr_loc+1; i++) { //pentru fiecare din locurile speciale st=maxL+loc[i]; //timpul maxim cand ajunge ultima furnica din stanga in acest loc dr=maxR-loc[i]+l;//timpul maxim cand ajunge ultima furnica din dreapta in acest loc if (st>dr) //deci in acest loc se ajunge dupa poz secunde poz=st; //(maximul dintre furnica stanga si furnica dreapta) else poz=dr; if (loc[i]>l-loc[i]) //se adauga eventuslul timp de asteptare poz=poz+loc[i]; //pana ajunge cealalta furnica else poz=poz+l-loc[i]; if (poz