Afişează mesaje
|
Pagini: 1 2 [3] 4 5 6
|
57
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1102 Turnuri2
|
: Februarie 24, 2011, 21:17:58
|
eu am alta idee care nu e o(N) fac cam asa: iau un vector in care v[ i ] este pozitia turnului din stanga pana la care se poate vedea de pe turnul i apoi fac un for de la 1 la n si det turnul pana la care se poate vedea asa: daca sunt la turnul i, verific pentru turnul i - 1. daca turnul i - 1 e mai inalt ca i atunci ne oprim si punem v[ i ] = i - 1; daca nu ne ducem la v[i - 1], care e primul turn strict mai inalt ca i - 1 (sa zicem ca v[i - 1] = j) si verificam pentru ala daca ala e mai inalt ne oprim si punem v[ i ] = j; daca nu verificam pt v[j], care e primul turn strict mai inalt decat j si tot asa... asta pentru partea stanga, si pentru dreapta tot asa si eu am pe un test cam o secunda, deci sigur nu e solutia buna, o sa ma uit la cea cu stiva chiar is curios cum ai scos o(n) multumesc L.E. : da mi se pare ca de fapt is aceleasi solutii nu?
|
|
|
62
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1097 Difprim
|
: Decembrie 30, 2010, 14:11:11
|
am nevoie de putin ajutor, am 2 surse aproape identice, una de 100 si alta de 60 si chiar nu vad care e diferenta sursa de 100: # include <fstream> using namespace std; int A, B, st, dr, p1, p2, sol; char a[(10000000 >> 3) + 100000]; int main (){ ifstream f ("difprim.in"); ofstream g ("difprim.out"); f >> A >> B; int i = 4; for (i = 4; i <= 10000000; i += 2) a[i >> 3] |= (1 << (i & 7) ); i = 1; while (i <= 400000){ do{ i += 2; }while ( ( a[i >> 3] & (1 << (i & 7) ) ) ); for (int j = i + i; j <= 10000000; j += i) a[j >> 3] |= (1 << (j & 7) ); } //for (i = 1; i <= 30; ++i) // if ( !( a[i >> 3] & (1 << (i & 7) ) ) ) // g << i << ' '; for (i = A + 1; i < B; ++i){ if ( !( a[i >> 3] & (1 << (i & 7) ) ) ){ st = dr; dr = i; if (sol < dr - st && st){ sol = dr - st; p1 = st; p2 = dr; } } } if (!sol) g << "-1\n"; else g << p1 << ' ' << p2 << '\n'; g.close (); return 0; } si cea de 60: # include <fstream> using namespace std; std :: ifstream f ("difprim.in"); std :: ofstream g ("difprim.out"); char a[(10000000 >> 3) + 10000]; int A, B; void ciur (){ for (int i = 4; i <= 10000000; i += 2) a[i >> 3] |= (1 << (i & 7) ); int i = 1; while (i <= 100000){ do { i += 2; } while (a[i >> 3] & (1 << (i & 7) )); for (int j = i + i, val = (i << 1); j <= 10000000; j += i) a[j >> 3] |= (1 << (j & 7) ); } } int af1, af2, MAX = 0; int main (){ f >> A >> B; ciur (); int ac, an; for (int i = A + 1; i < B; ++i){ if ( !(a[i >> 3] & (1 << (i & 7) ) ) ){ an = ac, ac = i; if (MAX < ac - an && an){ MAX = ac - an; af1 = an; af2 = ac; } } } if (!MAX) g << "-1\n"; else g << af1 << ' ' << af2 << '\n'; return 0; } as fi recunoscator celui care mi-ar zice ce e gresit in cea de-a doua multumesc
|
|
|
73
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1087 Doi
|
: Decembrie 09, 2010, 21:49:50
|
cred ca erorile tale ar putea fi urmatoarele: 1.ar fi http-ul ala de la inceput dar cred ca a aparut de la site 2.ai grija ca implementarea trebuie pe nr mari 3.nici solutia nu e buna, tu poti si sa aduni nu numai sa scazi, citeste solutia lui robert simoiu din acest topic si incearca sa o faci pe numere mari pentru 100 de puncte (operatiile pe numere mari le gasesti in articolul cu smenuri de programare) bafta
|
|
|
|