Afişează mesaje
|
Pagini: 1 2 3 [4] 5 6 ... 29
|
76
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1282 Palindrom3
|
: Martie 03, 2015, 00:12:16
|
E gresita abordarea inversa. Mergand de la stanga la dreapta (i=1..N/2), tu practic stergi cifrele din capat (baab -> aa). Din pacate, asta face ca, avand o cifra k, sa poti sa ajungi din restul curent in mai multe resturi diferite cu acelasi cost. Cel mai simplu test pe care l-am putut gasi este: 1 0 0 0 0 0 0 0 0 0 5015 5 Raspunsul corect e 5115 iar in varianta ta da 5005. Asta fiindca daca adaugi la margine cifra 5, numarul devine 5xx5. Indiferent daca adaugi 5-ul la restul 0 sau 1, obtii tot restul 0. In general, j * 10 % K poate da valori egale pentru j-uri diferite. N-ai de unde sa stii care rest e cel bun. In schimb, in varianta corecta j-ul nu se inmulteste cu nimic si, deci, pentru fiecare new_rest si o cifra k ai un unic j. Interesant
|
|
|
84
|
infoarena - concursuri, probleme, evaluator, articole / Probleme externe / Răspuns: Robot
|
: Ianuarie 18, 2015, 13:06:04
|
Bitii nu fac decat sa scrie mai simplu o valoare mare, dar poti scrie si manual un miliard. Trebuie sa fie o valoare mare astfel incat cand faci min(INFINIT, alta_valoare) sa se ia tot timpul alta_valoare. Al doilea return din functie e un fel de else implicit. Daca intra la if se iese din functie iar daca nu se merge la celalalt return. E echivalent cu abs(). Matricea sol o calculezi cu programare dinamica, nu are legatura cu bitii.
|
|
|
88
|
infoarena - concursuri, probleme, evaluator, articole / Informatica / Răspuns: Optimizare problema arbori
|
: Ianuarie 13, 2015, 16:25:33
|
E destul de ciudat enuntul, sper ca am inteles bine problema. Presupun ca daca A il mosteneste pe B si B pe C atunci si A pe C.
O solutie mai buna ar fi sa imparti cele M query-uri in bucati de sqrt(M). Pentru fiecare bucata, calculezi vectorul S[i] = stramosul cu nivelul minim pe care il mosteneste (cel mai de sus). Apoi, operatiile se fac astfel:
2. O(1), pur si simplu marchezi. 1. O(1), marchezi la nodul x ca la query-ul cu indexul i i s-a atribuit valoarea y. 3. Ai lista L de noduri ale caror valoare s-a schimbat (maxim sqrt(M)). Mergi din x pana in stramosul cu nivelul minim (posibil diferit de S[i]) in maxim sqrt(M) pasi si de fiecare data cand treci pe langa un nod din L vezi cu ce valoare a contribuit la x.
Iese complexitatea O(N*sqrt(M) + M*sqrt(M)).
|
|
|
95
|
infoarena - concursuri, probleme, evaluator, articole / Probleme externe / Răspuns: Iesire din matrice
|
: Decembrie 18, 2014, 12:58:28
|
O greseala e ca faci l-- in ultimul while. In rest, am schimbat putin while-urile. Spor. #include <iostream> #include <fstream>
using namespace std;
int main() { ifstream f("turist.in"); int a[10][10],n,m,i,j,l=0,v=0,gresit,Sminima=3200,nrlinie,nrcoloana,doarS; f>>n>>m; for(i=1;i<=n;i++)for(j=1;j<=m;j++)f>>a[i][j]; for(i=2;i<n;i++){for(j=2;j<m;j++) { l=i;v=j;gresit=0;doarS=0; if(a[i][j]<0) { v--; while(v>=1&&gresit==0) //orizonatal stanga { if(a[l][v]<0)gresit=1; else doarS+=a[l][v]; v--; } if(gresit==0&&doarS<Sminima) { Sminima=doarS;nrcoloana=j;nrlinie=i; } l=i;v=j; doarS=0;gresit=0;
v++; while(v<=m&&gresit==0) //orizontal dreapta { if(a[l][v]<0)gresit=1; else doarS+=a[l][v]; v++; } if(gresit==0&&doarS<Sminima) { Sminima=doarS;nrcoloana = j;nrlinie=i; } l=i;v=j; doarS=0;gresit=0;
l--; while(l>=1&&gresit==0) // vertical in jos { if(a[l][v]<0)gresit=1; else doarS+=a[l][v]; l--; } if(gresit==0&&doarS<Sminima) { Sminima=doarS;nrcoloana = j;nrlinie=i;
} l=i;v=j; doarS=0;gresit=0; l++; while(l<=n&&gresit==0) // vertical in sus { if(a[l][v]<0)gresit=1; else doarS+=a[l][v]; l++; } if(gresit==0&&doarS<Sminima) { Sminima=doarS;nrcoloana = j;nrlinie=i;
} } }} ofstream g("turist.out"); g<<Sminima<<endl<<nrlinie<<endl<<nrcoloana;
}
|
|
|
|