infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Dan-Leonard Crestez din Martie 08, 2004, 20:03:29



Titlul: 016 Joc
Scris de: Dan-Leonard Crestez din Martie 08, 2004, 20:03:29
Aici puteţi discuta despre problema Joc (http://infoarena.ro/problema/joc).


Titlul: 016 Joc
Scris de: Dan-Leonard Crestez din Aprilie 01, 2004, 03:01:55
Uite ca am si eu o nelamurire la aceasta problema.
Prin "diferenta de scor" se intelege cumva modul? In cazul in care se intelege modul, problema a devenit brust MULT mai grea, sincer eu nu am nici o idee.


Titlul: 016 Joc
Scris de: Mircea Pasoi din Aprilie 01, 2004, 09:38:54
Diferenta de scor inseamna "Scor Gicu - Scor Nicu"


Titlul: 016 Joc
Scris de: Dan-Leonard Crestez din Aprilie 01, 2004, 13:02:25
Ar trebui sa pui asta in enunt. Really.


Titlul: De ce nu merge???! :PPPP
Scris de: Voicu Octavian din Ianuarie 31, 2005, 23:30:42
Am facut o solutie O(N*M) cu programare dinamica... si nu stiu ce are, ca iau doar 30 de puncte... si rationamentul meu pare infailibil  :D
Am o matrice de BEST de NxM , A e aia citita din fisier... in principiu e ceva de genu best[j]=a[j]-MAX(best[i-1][j],best[j-1])... si asta in 2 for-uri, mai intai unu pt linii si apoi pt coloane... ce gresesc?  :cry:

Se ofera careva care a facut-o sa se uite pe sursa mea? Merg doar cazurile 6, 8, 9... restul wrong answer.

Daca se ofera careva voluntar sa se uite pe sursa mea, sa-mi lase mailu pe private or smth... multumesc anticipat.  :D


Titlul: 016 Joc
Scris de: Sara Nicolae Bogdan din Martie 17, 2005, 17:15:08
Ziceti-mi si mie cat da pe  :

5 7
1  1 -3  1  3   1  2
2  1  3  4  0   5  3
3 -1 -2  0  4  -1  4
2  3  4  5  6   2  3
3  1  2  1  2   1  2

si pe :
4 6
 2  1  3   4  0   5
 3 -1 -2  0   4 -1
-1 -2 -3 -4 -5 -6
 1  2  3  4   5  6
poate ma prind ce-am gresit.

Multumesc anticipat! ](*,)


Titlul: 016 Joc
Scris de: Mircea Pasoi din Martie 17, 2005, 17:30:50
Citat din mesajul lui: sarabogdan
Ziceti-mi si mie cat da pe  :

5 7
1  1 -3  1  3   1  2
2  1  3  4  0   5  3
3 -1 -2  0  4  -1  4
2  3  4  5  6   2  3
3  1  2  1  2   1  2

si pe :
4 6
 2  1  3   4  0   5
 3 -1 -2  0   4 -1
-1 -2 -3 -4 -5 -6
 1  2  3  4   5  6
poate ma prind ce-am gresit.

Multumesc anticipat! ](*,)


3 2 6 si 3 1 6


Titlul: 016 Joc
Scris de: Sara Nicolae Bogdan din Martie 17, 2005, 17:35:39
10X domino!


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Martie 22, 2005, 12:33:55
Buna :D , toate testele care le-am dat la joc mie mi-au iesit corect...
Iar la evaluare am 1..9 gresit si 10 time limit exceeded.
Am o solutie inspirata de la Druid...
Am o matrice Sol,A,Max
in Sol memorez solutia , A este matricea din fisier iar in Max retin valoarea maxima din Sol din dreptunghiul (1,1) si (i,j)...
sol[i,j]:=a[i,j]-max[i,j].
Si cam atat ar fi in mare...
NU cred ca ideea mea de rezolvare ii gresita , ci poate am ceva gresit in implementare
Daca ai putea pls sa-mi dai un test mai mic sa vad unde naiba gresesc !
#-o.


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Martie 24, 2005, 10:34:55
NU imi dau seama nicicum unde gresesc  :(
daca se poate uita cineva peste sursa mea...
NU o sa mai postesz si partea de citire si afisare...

function maxim(a,b:integer):integer;
begin
maxim:=(a+b+abs(a-b)) div 2;
end;

procedure calcul;
begin
fillchar(sol,sizeof(sol),0);
Vmax:=-1000;i:=1;j:=1;
for i:=1 to n do
    for j:=1 to m do
        begin
         sol[i,j]:=a[i,j]-max[i,j];
         max[i,j]:=maxim(max[i,j],sol[i,j]);
         max[i,j+1]:=max[i,j];
         max[i+1,j]:=max[i,j];
         if Vmax<sol[i,j] then
            begin
             Vmax:=sol[i,j];
             si:=i;sj:=j;
            end;
        end;
end;

Chiar nu pot sa-mi dau seama unde gresesc...Eventual daca cineva imi gaseste un test in care programul meu greseste(eu n-am reusit sa gasesc)

                   Multumesc anticipat


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Martie 25, 2005, 12:07:31
Gata am gasit care e problema...  :D
NU ii corecta partea cu max...Am facut-o altfel , ii mai lenta , iau 60 de puncte pe ea, ultimele teste time limit exceeded.


Titlul: 016 Joc
Scris de: Kelemen Stelian din Martie 25, 2005, 12:29:07
incerca sa nu mai  folosesti functii cum ar fi  abs, mai bine implementeazo singur , pt ca mananca timp,   asa am patit eu pe  .campion  cu  functia  sqrt, (TLE)


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Martie 25, 2005, 16:37:11
Nu stiam ca abs ar manca mult timp.
Dar cum spui tu sa o implementez  cu IF ?
Nu ii mai lenta asa !?
Thx pentru observatie :P


Titlul: 016 Joc
Scris de: Bogdan-Cristian Tataroiu din Aprilie 29, 2005, 13:00:46
Imi poate da cineva un contraexemplu pentru algortimul dat de druid? Mie mi se pare corect, dar totusi iau doar 30 puncte pe el


Titlul: 016 Joc
Scris de: Cosmin Negruseri din Aprilie 29, 2005, 14:14:27
Ai grija ca trebuie sa iei maximul din dreptunghiul lui (1,1) (i,j) dar sa nu incluzi si pe sol[j] deci mai bine iei maximul din (1,1) (i-1,j)  si maximul din (1,1) (i,j-1)


Titlul: 016 Joc
Scris de: Bogdan-Cristian Tataroiu din Aprilie 29, 2005, 15:13:54
Poti sa-mi explici ce ai vrut sa zici, ca n-am reusit sa inteleg. Scuze... :-s


Titlul: 016 Joc
Scris de: Cosmin Negruseri din Aprilie 29, 2005, 15:39:08
Am vazut aiurea ceva in postul anterior, dar nu stiu ce face in codul asta:
max[i,j+1]:=max[i,j];
max[i+1,j]:=max[i,j];
 Nu ar trebui sa faca un if cand actualizeaza max[i,j+1] si max[i+1,j]?


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Aprilie 29, 2005, 15:42:16
pe solutia urmatoare...
Cod:

for i:=1 to n do
    for j:=1 to m do
        begin
         sol[i,j]:=a[i,j]-max[i,j];
         max[i,j]:=maxim(max[i,j],sol[i,j]);
         max[i,j+1]:=maxim(max[i,j],max[i,j+1]);
         max[i+1,j]:=maxim(max[i,j],max[i+1,j]);
         if Vmax<sol[i,j] then
            begin
             Vmax:=sol[i,j];
             si:=i;sj:=j;
            end;
        end;

Iau 30 p... Daca , calculez max babeste si nu iau punctul [i,j] iau
60p ,ultimele 4 teste nu se incadreaza in timp...
Pentru solutia de 30 p nu determina totdeauna max corect dar nu stiu de
ce...  :|

Edit:

Cosmin: probabil ca te refereai la mine...
Ce am scris eu acolo era o prostie , luam 0 p pe ea... :lol:


Titlul: 016 Joc
Scris de: Cosmin Negruseri din Aprilie 29, 2005, 19:33:12
Bah ti-am zis si dincolo sa folosesti "[code]" ca nu se intelege nimic.


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Aprilie 29, 2005, 23:34:15
Ii ok acuma!?  :wink:


Titlul: 016 Joc
Scris de: Cosmin Negruseri din Aprilie 30, 2005, 00:14:45
Da, super! :)


Titlul: 016 Joc
Scris de: u-92 din Iulie 19, 2005, 19:20:01
totusi.. eu nu sunt lamurit deloc.. care e pana la urma greseala in algoritmul prezentat mai sus de druid.. poate cineva care sa-mi dea vreo indicatie?

multumesc.


Titlul: 016 Joc
Scris de: Dobre Catalin Andrei din Iulie 19, 2005, 20:13:18
Incearca sa dai niste  teste cu valori negative, eu acolo am avut greseala si dupa ce am sesizat-o am luat 100 p.
Hope it help's ...


Titlul: 016 Joc
Scris de: u-92 din Iulie 21, 2005, 17:47:02
da.. aici era greseala. mersi


Titlul: 016 Joc
Scris de: Oltean Dorin din Octombrie 04, 2005, 16:01:29
pentru a calcula maximul folosesc urmatoarea secventa:
Cod:

max = -32001;
if(b[i-1][j] > max)
max = b[i-1][j];

if(b[i][j-1] > max)
max = b[i][j-1];

if(c[i-1][j] > max)
max = c[i-1][j];

if(c[i][j-1] > max)
max = c[i][j-1];

b[i][j] = max;

imi poate spune cineva ce am gresit pentru ca iau numai 30 de puncte restul WA


Titlul: 016 Joc
Scris de: Bogdan-Cristian Tataroiu din Octombrie 04, 2005, 17:16:13
Eu luam 30 pct pentru ca gresisem initializarea matricei


Titlul: Răspuns: 016 Joc
Scris de: Gabriel Bitis din August 23, 2007, 22:02:06
Citat din mesajul lui: sarabogdan
Ziceti-mi si mie cat da pe  :

...

4 6
 2  1  3   4  0   5
 3 -1 -2  0   4 -1
-1 -2 -3 -4 -5 -6
 1  2  3  4   5  6
poate ma prind ce-am gresit.

Multumesc anticipat! ](*,)

 3 1 6

Nu pricep cum obtine diferenta 3..
Gicu ia 5 (1,6), Nelu 4 (1,4) => dif=1;
Gicu ia 3 (1,3), Nelu 2 (1,1)=> dif=2;
si se termina jocul...

ceea ce e totuna cu: Gicu ia 2(1,1)... si se termina.. e aceasi diferenta.. avand in vedere ca amandoi joaca optim, nu ma prind ce nu am inteles in exemplul respectiv...


Titlul: Răspuns: 016 Joc
Scris de: Bogdan-Alexandru Stoica din August 24, 2007, 13:54:16
diferenta 3 se obtine astfel: Gicu ia 5 (1,6), Nelu ia 4 (1,4), Gicu ia 2 (1,1). 5+2-4 = 3
prima linie a matricii este si exemplul dat de mircea, al carui raspuns este tot 3 1 6.

LE: strategia dupa care ai incercat sa rezolvi exemplul de mai sus e greedy. problema se rezolva prin programare dinamica (cel putin asa am rezolvat-o eu)


Titlul: Răspuns: 016 Joc
Scris de: Usurelu Catalin din Ianuarie 24, 2011, 23:36:21
Nu inteleg deloc de ce nu merge testul 8. Algoritmul meu memoreaza in sol[ i ][ j ] - maximul  pana la (i,j) (desigur memorez undeva solutia ca sa fie pe lina si coloana potrivita). sol[ i ][ j ]=max(sol[ i-1 ][ j ],sol[ i ][ j-1 ],a[ i ][ j ]-sol[ i ][ j-1 ],a[ i ][ j ]-sol[ i-1 ][ j ]).
Teoretic ar trebui sa mearga perfect.
Ba chiar arata si greseala din exemplul lui domino (vad ca nu a mentionat nimeni, pentru primul test solutia e 3 2 4 nu 3 2 6).


Titlul: Răspuns: 016 Joc
Scris de: Vidrean Mihai din Octombrie 24, 2011, 16:09:22
Chiar nu am nici o idee de rezolvare :shock:,ma puteti ajuta cu niste indicatii?? :-k


Titlul: Răspuns: 016 Joc
Scris de: Simoiu Robert din Octombrie 24, 2011, 16:53:48
Chiar esti orb ? Pe bune acum, rezolvarea este exact cu un post mai sus, si minune e si corecta  :shock:.


Titlul: Răspuns: 016 Joc
Scris de: Ion Ureche din Iunie 29, 2012, 22:06:59
Cat va da pentru testul respectiv?
1 2
-5 -5


Titlul: Răspuns: 016 Joc
Scris de: Simoiu Robert din Iunie 29, 2012, 22:43:16
Cod:
0 1 2


Titlul: Răspuns: 016 Joc
Scris de: Ion Ureche din Iunie 30, 2012, 11:39:48
Intuieste cineva ce are testul 8 ? Solutia mea e asemanatoare cu cea descrisa de usurelu catalin .


Titlul: Răspuns: 016 Joc
Scris de: FII Florea Toma Eduard din Septembrie 19, 2012, 17:26:29
 @ Ursuletul Catalin: pentru acel test a lui Domino,raspunsul este chiar 3 2 6  :-'....


Titlul: Răspuns: 016 Joc
Scris de: Teudan Adina din Februarie 19, 2013, 13:31:00
Cod:
for (i = 1; i <= N; ++i)
for (j = 1; j <= M; ++j)
maxmat[i][j] = best[1][1];

...

Cod:
if (best[i][j] > maxmat[i][j]) 
for (k = i; k <= N; ++k)
for (l = j; l <= M; ++l)
maxmat[k][l] = best[i][j];

Iau 80 de puncte cu WA pe 6 si 9, si am ajuns la concluzia ca este din cauza maximului. Asta este bucata unde lucrez cu maximul... Nu imi dau seama de greseala nicidecum. Sa fie altceva?


Titlul: Răspuns: 016 Joc
Scris de: Iffi Fiffi din Mai 27, 2013, 18:42:31
Va rog foarte frumos sa mentionati in restrictiile problemei ca diferenta de scor inseamna scor Gicu - scor Nicu. Cuvantul "diferenta" are o alta semnificatie decat cea pe care o are in enunt. Am pierdut foarte mult timp si nu as vrea sa piarda si altii.


Titlul: Răspuns: 016 Joc
Scris de: Paul-Dan Baltescu din Mai 27, 2013, 19:12:18
Diferenta (http://dexonline.ro/definitie/diferen%C8%9B%C4%83): vezi prima definitie, semnificatia 2.


Titlul: Răspuns: 016 Joc
Scris de: Andrei Grigorean din Mai 27, 2013, 19:32:38
Citeste primele doua comentarii din acest topic. Enuntul este destul de clar.


Titlul: Răspuns: 016 Joc
Scris de: Barbu Dorel din Noiembrie 13, 2014, 21:48:39
Va rog, ar putea posta cineva o mica explicatie a relatiei de reucrenta? d[ i][j] = diferenta maximace poate fi obtinuta in dreptunghiul incadrat de pozitia (1,1) si (i,j). Eu asa m-am gandit, dar nu ma prind cum sa continui. Am vazutca intr-adevar, si altii au facut asa. Mi-ar prinde bine un hint. multumesc in avans!


Titlul: Răspuns: 016 Joc
Scris de: Lungu Vlad din Aprilie 18, 2016, 22:01:39
Ok...nu pot sa trec peste 60 de punte orice as face. Ma poate ajuta cineva?


Titlul: Răspuns: 016 Joc
Scris de: Lungu Vlad din Aprilie 18, 2016, 22:06:21
Nevermind....era o greseala stupida.... ](*,) ](*,) ](*,)


Titlul: Răspuns: 016 Joc
Scris de: mihai craciun din Ianuarie 17, 2017, 00:13:17
Problema asta ma dispera. Am facut cu programare dinamica si tot imi da 70 de puncte, cu testele 6, 8, 9 WA. Uitati codul:

Cod:

#include <bits/stdc++.h>

#define Max 1004

FILE *fin, *fout;
int N, M;
int a[Max][Max];
int maxi[Max][Max], sol[Max][Max];

inline int smax(int a, int b)  {
    if(a > b)
        return a;

    return b;
}


int main()  {
    fin = fopen("joc.in", "r");
    fout = fopen("joc.out", "w");

    int s;

    fscanf(fin, "%d%d", &N, &M);

    for(int i = 1;i <= N;i++)
        for(int j = 1;j <= M;j++)
            fscanf(fin, "%d", &a[j]);
    int ri, rj;

    s = a[1][1];
    ri = 1, rj = 1, maxi[1][1] = a[1][1];
    sol[1][1] = a[1][1];
    maxi[1][2] = a[1][1];
    maxi[2][1] = a[1][1];


    for(int i = 1;i <= N;i++)
        for(int j = 1;j <= M;j++)  {
            if(i == 1 && j == 1)
                continue;
            sol[j] = a[j] - maxi[j];
            maxi[j] = smax(maxi[j], sol[j]);
            maxi[j + 1] = maxi[j];
            maxi[i + 1][j] = maxi[j];
            maxi[i + 1][j + 1] = maxi[j];
            if(sol[j] > s)
                s = sol[j], ri = i, rj = j;
        }

    fprintf(fout, "%d %d %d", s, ri, rj);

    fclose(fin);
    fclose(fout);

    return 0;
}

Later edit:

Am luat 100p. Am refacut dinamica si a mers :)


Titlul: Răspuns: 016 Joc
Scris de: Florin Gabriel Haja din Martie 02, 2017, 09:34:53
De ce nu e diferența maximă 10? Rețin o matrice smax[2][ i][j] , în care rețin soluția maximă pe care o obțin având ultimul jucător Gicu (pt. rândul 0) sau Nicu (pt. rândul 1). Gicu poate lua jetoanele de valoare 5, 4 și 2, iar Nicu cele de valoare 0 și 1.


Titlul: Răspuns: 016 Joc
Scris de: Andi Arnautu din Martie 02, 2017, 10:58:41
Citat
Presupunand ca fiecare din cei doi joaca optim

Pe cazul din exemplu se intampla ceea ce este scris la explicatii, mai jos de enunt.

Ideea este ca primul jucator vrea sa maximizeze diferenta, iar cel de-al doilea urmareste sa o minimizeze, asta inseamna ca "amandoi joaca optim". ;)


Titlul: Răspuns: 016 Joc
Scris de: Patrick Kristian Ondreovici din Iulie 21, 2019, 10:00:56
Daca am matricea 6 1 2 3 4 7 Gicu alege 7 sau 6 ????


Titlul: Răspuns: 016 Joc
Scris de: Patrick Kristian Ondreovici din Iulie 21, 2019, 10:07:08
Never mind, am inteles!