infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: ditzone din Octombrie 23, 2005, 21:52:25



Titlul: 128 Curse de cai
Scris de: ditzone din Octombrie 23, 2005, 21:52:25
Aici puteţi discuta despre problema Curse de cai (http://infoarena.ro/problema/cai).


Titlul: 128 Curse de cai
Scris de: Vlad Berteanu din Octombrie 24, 2005, 13:47:15
Greedy-ul pt problema asta va ramane un mister pt multa lume sau cineva se va indura sa dea un hint ? .... ](*,)


Titlul: 128 Curse de cai
Scris de: Mircea Pasoi din Octombrie 24, 2005, 13:58:17
Din cate am vazut la concurs, n-a fost un mare mister greedy-ul corect...  apropo, problema poate fi rezolvata si cu dinamica.


Titlul: 128 Curse de cai
Scris de: Andrei Grigorean din Octombrie 24, 2005, 16:37:52
incearca sa maximizezi numarul curselor castigate de gigel, incercand sa pui fiecare cal de-al sau sa concureze cu un adversar pe care poate sa-l invinga, cat mai puternic.


Titlul: 128 Curse de cai
Scris de: Tiberiu-Lucian Florea din Octombrie 24, 2005, 16:50:13
Cred ca ar fi bine sa nu mai spuneti cum se rezolva problemele... altii vor invata destul de greu daca nu mai trebuie sa gandeasca, gasind pe forum solutiile care au fost acceptate.  :roll:


Titlul: 128 Curse de cai
Scris de: cristi8 din Octombrie 24, 2005, 19:45:41
nu, deci pe bune. ce faceai in caz ca un cal al lui gigel avea aceasi viteza cu un cal de-al adversarului (si nu putea bate nici un alt cal) ? il bagai la egalitate sau il puneai sa piarda ? cum decideai ?


Titlul: 128 Curse de cai
Scris de: Iorgulescu Calin din Octombrie 24, 2005, 19:53:15
Ahem... poate ca pare ciudat... dar... n-ar fi fost mai buna egalitatea?  8-[
Adica ... daca nu putea bate un alt cal... e clar ca profitul adus era <=0 ... deci ... cea mai mare valoare... nu ar fi 0? Adica remiza?

Eu faceam in felul urmator:
1. Sortam caii si ai lui gigel si ai lui ionel crescator.
2. Pornind de la 1 parcurgeam caii astfel:
  2.a. Daca cal Gigel > cal Ionel => Gigel+200 lei. Se trece la urmatorii 2 cai.
  2.b. Daca cal Gigel = cal Ionel se trece la urmatorii 2 cai.
  2.c. Daca cal Gigel < cal Ionel => Gigel-200 lei. Se compara calul acesta al lui Gigel cu urmatorul cal al lui Ionel.

In mod normal ar trebui sa asigure ca caii care vor castiga sunt maximi.  :-k


Titlul: 128 Curse de cai
Scris de: Mircea Pasoi din Octombrie 24, 2005, 20:04:54
Citat din mesajul lui: calinux
Ahem... poate ca pare ciudat... dar... n-ar fi fost mai buna egalitatea?  8-[
Adica ... daca nu putea bate un alt cal... e clar ca profitul adus era <=0 ... deci ... cea mai mare valoare... nu ar fi 0? Adica remiza?

Eu faceam in felul urmator:
1. Sortam caii si ai lui gigel si ai lui ionel crescator.
2. Pornind de la 1 parcurgeam caii astfel:
  2.a. Daca cal Gigel > cal Ionel => Gigel+200 lei. Se trece la urmatorii 2 cai.
  2.b. Daca cal Gigel = cal Ionel se trece la urmatorii 2 cai.
  2.c. Daca cal Gigel < cal Ionel => Gigel-200 lei. Se compara calul acesta al lui Gigel cu urmatorul cal al lui Ionel.

In mod normal ar trebui sa asigure ca caii care vor castiga sunt maximi.  :-k


Ce faci pentru?

Cod:
1 2 3 4 5
1 2 3 4 5


Se poate obtine castig 600 astfel: 2-1, 3-2, 4-3, 5-4, 1-5.


Titlul: 128 Curse de cai
Scris de: Bogdan-Cristian Tataroiu din Octombrie 24, 2005, 20:16:32
Nu e atat de simplu... In primu rand sortezi descrescator.
Citat
Adica ... daca nu putea bate un alt cal... e clar ca profitul adus era <=0 ... deci ... cea mai mare valoare... nu ar fi 0?
Se poate obtine profit pe viitor daca pierzi la momentul actual. Uite un exemplu:
7
1 2 3 4 5 6 7
1 2 3 4 5 6 7

Greedyu tau iti da 0, solutia corecta este 1000  :thumbup: (1 joaca cu 7, 7 cu 6, 6 cu 5, 5 cu 4, 4 cu 3, 3 cu 2, 2 cu 1)
In caz de egalitate trebuie sa analizezi toti caii ce urmeaza dupa cei doi care se afla la egalitate si sa vezi care din cele doua cazuri ar fi mai bun (te las sa te prinzi). De asemenea daca la pasul i calul al lui Gigel ar pierde in fata calului lui Ionel atunci pui calul cu viteza cea mai mica a lui Gigel sa concureze cu calul lui Ionel, ca sa pastrezi caii cei mai buni pentru restul cailor lui Ionel.


Titlul: 128 Curse de cai
Scris de: cristi8 din Octombrie 24, 2005, 20:27:26
Citat
In caz de egalitate trebuie sa analizezi toti caii ce urmeaza dupa cei doi care se afla la egalitate si sa vezi care din cele doua cazuri ar fi mai bun

backtracking ?


Titlul: 128 Curse de cai
Scris de: Catalin Tiseanu din Octombrie 24, 2005, 22:43:21
ceva in O(N) asa ... back nu prea intra [ depinde ce intelegi prin back ].


Titlul: 128 Curse de cai
Scris de: cristi8 din Octombrie 25, 2005, 19:07:00
pai din cate am inteles eu e O(2^N).
daca ai vitezele lui gigel egale cu cele ale lui ionel
Cod:
v1 v2 v3 v4 v5
v1 v2 v3 v4 v5

vezi ca v1 sunt egale, treci la urmatoarele. vezi ca v2 sunt egale, treci la v3.. si  tot asa.. si vine O(2^N)

..am inteles gresit ?


Titlul: 128 Curse de cai
Scris de: Bogdan-Alexandru Stoica din Octombrie 25, 2005, 19:26:24
La problema aceasta sunt doua solutii la care poti sa te gandesti :
1) greedy
2) dinamica

Prima solutie este un N^2. Cristi, tu ai inceput bine cu backtracking-ul, dar trebuie sa vezi cum il faci astfel incat sa efectueze N^2 operatii. de fapt nu este nevoie sa generezi toate combinatiile intre caii lui ionel si caii lui gigel, ci doar cateva.

A doua este o dinamica 2d ce se bazeaza pe trei chestii : ce faci cand calul tau e mai incet decat al adversarului, ce faci cand e mai rapid si ce faci cand caii sunt egali d.p.d.v al vitezei.

Sper sa ajunt, nu sa supar, pe cineva cu hint-urile astea O:) . Daca vor fi probleme se poate sterge post-ul meu ;)

Codare fericita in continuare.

Btw. stie cineva cand invie evaluatoru :-'


Titlul: 128 Curse de cai
Scris de: Tiberiu-Lucian Florea din Octombrie 25, 2005, 20:41:20
Citat din mesajul lui: cristi8
pai din cate am inteles eu e O(2^N).
daca ai vitezele lui gigel egale cu cele ale lui ionel
Cod:
v1 v2 v3 v4 v5
v1 v2 v3 v4 v5

vezi ca v1 sunt egale, treci la urmatoarele. vezi ca v2 sunt egale, treci la v3.. si  tot asa.. si vine O(2^N)

..am inteles gresit ?


Nu te mai gandi la nimic ne-polinomial.  :wink:


Titlul: 128 Curse de cai
Scris de: Claudiu Guiman din Octombrie 28, 2005, 21:02:27
am si eu o problema...... nu imi ajunge memoria (am o matrice de 1000 pe 2) si imi da eroarea RUN ERROR - Invalid memory reference . Cata memorie este  disponibila?


Titlul: 128 Curse de cai
Scris de: VladS din Octombrie 28, 2005, 21:57:14
Ce ai declarat tu are aproximativ 2 kb deci nu depasesti memoria. Ca sa te prinzi de ce primesti mesajul ala ai putea sa consulti
articolul din cadrul site-ului (http://info.devnet.ro/articole.php?page=art&art=57).


Titlul: 128 Curse de cai
Scris de: cristi8 din Octombrie 28, 2005, 21:57:26
iti intra si matrice 1000 pe 1000. sunt 64 de mb parca

vezi ca ti-o iau razna indicii si te duci in balarii


Titlul: 128 Curse de cai
Scris de: Claudiu Guiman din Octombrie 28, 2005, 22:03:12
nu depaseste


Titlul: Răspuns: 128 Curse de cai
Scris de: Mihai Leonte din Aprilie 02, 2007, 11:09:06
Va rog eu mult, puneti in textul problemei si limitele la problema asta. De exemplu:
- Cate teste sunt in fisier?
- Cat de mari/mici pot fi vitezele?

Oricum, eu tot ia 0 si nu imi dau seama de ce :(.
Fac cam asa ceva: (ambele grupuri de cai sortate desc)
Suntem la gigel [ i ] :
1. gaseste cel mai rapid cal al lui Ionel pe care il poti bate si bate-l (eivdent, nu luam in calcul caii care deja au luat parte la concurs).
2. daca nu poate bate pe nimeni, vezi, totusi, poate macar faci o remiza.
3. daca nici macar o remiza nu poti face, atunci de acum incolo sigur pierd toti caii lui Gigel, pt. ca gigel[i+1]<=gigel[ i ], oricare ar fi i=1,n-1

Am incercat o gramada de teste si toate dau corect. Si deja stau de ceva vreme la problema asta, si ma frustreaza.


Titlul: Răspuns: 128 Curse de cai
Scris de: Florian Marcu din Aprilie 08, 2007, 09:44:25
Uite un exemplu:
7
1 2 3 4 5 6 7
1 2 3 4 5 6 7

Greedyu tau iti da 0, solutia corecta este 1000  :thumbup: (1 joaca cu 7, 7 cu 6, 6 cu 5, 5 cu 4, 4 cu 3, 3 cu 2, 2 cu 1)

Nu stiu dak ideea ta functioneaza...

[later edit] Nu ! Am gresit eu...iti da corect...sorry.. Dar si eu am aceeasi problema... iau 0 puncte cu un algoritm care da corect pe toate exemplele mele...help me careva,...am citit toate mesajele de pe forum...dar pb asta ma dispera... :fool:


Titlul: Răspuns: 128 Curse de cai
Scris de: Savin Tiberiu din Iunie 08, 2007, 11:46:13
totusi la problema asta ar mai trebui puse niste restrictii, cum ar fi viteza maxima a unui cal :-'


Titlul: Răspuns: 128 Curse de cai
Scris de: Bondane Cosmin din Iulie 10, 2007, 21:39:12
Cat va da pentru :

Cod:
1
31
42 18468 6335 26501 19170 15725 11479 29359 26963 24465 5706 28146 23282 16828 9962 492 2996 11943 4828 5437 32392 14605 3903 154 293 12383 17422 18717 19719 19896 5448
21727 14772 11539 1870 19913 25668 26300 17036 9895 28704 23812 31323 30334 17674 4665 15142 7712 28254 6869 25548 27645 32663 32758 20038 12860 8724 9742 27530 779 12317 3036


Titlul: Răspuns: 128 Curse de cai
Scris de: Adrian Diaconu din Iulie 10, 2007, 22:11:22
Citat
3000


Titlul: Răspuns: 128 Curse de cai
Scris de: Ionescu Robert Marius din Iulie 11, 2007, 12:30:12
mie imi da tot 3000 si pe orice test facut de mine da bine,si iau incorect  :sad:


Titlul: Răspuns: 128 Curse de cai
Scris de: Sebastian Crisan din Iulie 12, 2007, 09:11:49
Ia vedeti ce obtineti pentru

Citat
9
6 4 4 4 4 2 2 2 1
4 4 4 4 4 2 2 1 1

ar trebui sa va dea

Citat
600

Edit: Am corectat raspunsul.




Titlul: Răspuns: 128 Curse de cai
Scris de: Adrian Diaconu din Iulie 12, 2007, 11:15:52
Cred ca ar trebui sa dea
Citat
600

Ii pui sa concureze asa:
Citat
6 4 4 4 4 2 2 2 1
4 4 4 4 2 2 1 1 4


Titlul: Răspuns: 128 Curse de cai
Scris de: Gabriel Bitis din August 30, 2007, 21:31:24
am verificat toate exemplele de pe forum + vreo 2 de'ale mele.. toate imi dau cat ar trebui (ma refer la cele de pe forum.. )... totusi.. iau incorect.... :'(.. vreo sugestie?


Titlul: Răspuns: 128 Curse de cai
Scris de: Hasna Robert din August 12, 2008, 18:13:33
Toate testele de pe forum si exemplu imi dau bine. Sortez crescator si fol doua deque.
Are cineva timp sa se uite peste sursa mea si sa imi dea un exemplu pe care nu merge?


Titlul: Răspuns: 128 Curse de cai
Scris de: Marius Stroe din August 12, 2008, 22:06:45
Nu ştiu unde ai folosit deque. :) Se poate şi fără.


Titlul: Răspuns: 128 Curse de cai
Scris de: A Cosmina - vechi din Iulie 18, 2009, 22:00:40
Fara dinamica/greedy nu se poate? Merita incercat un brute ?  :sad:


Titlul: Răspuns: 128 Curse de cai
Scris de: Andrei Grigorean din Iulie 19, 2009, 00:03:01
Nu prea sunt probleme pe infoarena care sa mearga cu brute :).


Titlul: Răspuns: 128 Curse de cai
Scris de: A Cosmina - vechi din Iulie 19, 2009, 09:07:55
Am inteles... :'(


Titlul: Răspuns: 128 Curse de cai
Scris de: Marius Stroe din Iulie 19, 2009, 14:09:04
Fara dinamica/greedy nu se poate? Merita incercat un brute ?  :sad:

Pentru ca unul să joace cât mai bine, celălalt trebuie să joace cât mai prost. Ţin minte că jucând cât mai prost am reuşit să rezolv foarte uşor problema cu Greedy.


Titlul: Răspuns: 128 Curse de cai
Scris de: A Cosmina - vechi din Iulie 19, 2009, 15:46:33
Eu m-am gandit sa sortez caii crescator. Compar primul cal al lui Gigel cu armasarul lui Ionel. Daca este mai mare Gigel +200,daca este egal 0, daca este mai mic -200.

Si asa aflu profitul lui Gigel. Nu cred ca este varianta cea mai optima,dar asta mi-a venit in minte.

Eu Greedy si dinamica nu stiu... :sad:


Titlul: Răspuns: 128 Curse de cai
Scris de: Emanuel Cinca din Iulie 19, 2009, 23:09:11
Nu cred ca e chiar corect ce ai spus tu, dar sa stii ca modalitatea ta de rezolvare e o tehnica greedy. Pe scurt in asta consta greedy: alegerea variantei optime (ce pare optima) la fiecare pas si de multe ori sortezi intr-un anumit mod datele. Sper ca nu m-am bagat in seama degeaba :? Bafta! :peacefingers:

PS:Esti fana LP?  :D


Titlul: Răspuns: 128 Curse de cai
Scris de: A Cosmina - vechi din Iulie 20, 2009, 08:11:48
Mersi pentru indicatii. O sa revin la problema asta dupa ce citesc cate ceva despre greedy.  :ok:


P.S: Linkin Park rocks.  :twisted:


Titlul: Răspuns: 128 Curse de cai
Scris de: Marginean Bogdan Alexandru din Martie 20, 2011, 17:44:44
Hi, thread necromancer here. All jokes aside, asta-i rezolvarea mea:

Cod:
 #include <stdio.h>
#include <algorithm>
using namespace std;
const long infi = 2147483647;
long t, n, suma;

long caiA[1010];
long caiB[1010];

int main()
{
    freopen("cai.in", "r", stdin);
    freopen("cai.out", "w", stdout);
    scanf("%d", &t);
    bool fweaker;
    bool fequal;
    int retinequal;
    int retincmm;
    for (int i = 0; i < t; ++i)
    {
        suma = 0;
        scanf("%d", &n);
        for (int j = 0; j < n; ++j) //Citim caii lui gigel
        {
            scanf("%d", &caiA[j]);
        }
        for (int j = 0; j < n; ++j) //Si caii lui ionel
        {
            scanf("%d", &caiB[j]);
        }
        sort(caiA, caiA + n); //Ordine crescatoare
        sort(caiB, caiB + n); //Ordine crescatoare
        for (int j = 0; j < n; ++j) //Pentru fiecare cal de-al lui Gigel, pornind de la cel mai slab
        {
            fequal = false; //Presupunem ca nu poate face remiza cu nici un cal de la Ionel
            fweaker = false; //Presupunem ca nu exista cal de-al lui Ionel mai slab decat calul curent de la Gigel
            retinequal = 0; //Retine pozitia pe care se afla calul cu care poate face remiza
            retincmm = -1; //Retine pozitia celui mai puternic cal de la Ionel. La fiecare cursa, presupunem ca nu am gasit inca
            for (int q = n-1; q >= 0; --q) //Pentru fiecare cal de-al lui Ionel, de la cel mai puternic in jos
            {
                if (caiA[j] > caiB[q]) //Daca calul curent al lui Gigel il poate bate pe cel al lui Ionel
                {
                    suma += 200; //Marim suma deoarece a obtinut o victorie
                    caiB[q] = infi; //Calul curent al lui Ionel a fost invins (nu va mai concura)
                    fweaker = true; //Am gasit un cal mai slab decat al lui Gigel
                    break; //Oprim for-ul
                }
                else //Altfel
                {
                  if ((caiA[j] == caiB[q]) && (fequal == false)) //Daca puterea celor doi este identica si nu am gasit inca o astfel de pereche
                  {
                      fequal = true; //Mentionam ca am gasit o pereche
                      retinequal = q; //Retinem pozitia pe care se afla calul pt. remiza @ Ionel
                  }
                  else //Altfel, calul lui este mai puternic decat al lui gigel
                  {
                       if ((caiB[q] != infi) && (retincmm == -1)) //Daca calul nu a participat deja la curse si nu am gasit deja un cal mai puternic la Gigel
                         retincmm = q; //Retinem pozitia pe care se afla calul cel mai puternic
                  }
                }
            }
            //Gata for-ul
            if (fweaker == false)
            {
               if ((fequal == true) && (retincmm == -1)) //Daca putem face remiza
               {
                caiB[retinequal] = infi; //Facem
                //continue;
               }
               else
               {
               //altfel...
                suma-=200;
                caiB[retincmm] = infi; //Si il scoatem din joc pe cel mai puternic cal de-al lui Ionel
               }
            }
        }
        printf("%d\n", suma);
    }
    return 0;
}

Mai exact, eu sortez crescator caii (retinuti in 2 siruri) si incepand cu primul cal al lui Gigel (cel mai slab), verific cu fiecare cal de-al lui Ionel (incepand cu cel mai puternic -> parcurg descrescator) care-i situatia. Fiecare cal de-al lui Gigel incearca sa bata un cal cat mai puternic de la Ionel. Daca nu poate asta, atunci il scoate pe cel mai puternic cal de-al lui Ionel din joc (din multimea de cai care nu au participat inca la curse), pentru a face viata mai usoara cailor ce urmeaza. Daca cumva nu poate bate un cal si nici nu-i unul mai puternic disponibil, face remiza.
infi marcheaza un cal care a participat deja la cursa.

Pe toate exemplele mele da bine. La fel si pe cele de pe forum. Nu prea imi vine nimic in minte in momentul asta. In caz ca e cineva de pe aici dispus sa se uite la vechile surse de 100p  pentru mine, ar fi super :) Sau daca greseala mea se observa usor, astept sugestii.


Titlul: Răspuns: 128 Curse de cai
Scris de: Dragos Martac din Martie 31, 2013, 14:13:33
Cat de mare poate sa fie T-ul (numarul de teste)?  ???


Titlul: Răspuns: 128 Curse de cai
Scris de: Dumitru Andrei Georgian din Aprilie 01, 2013, 13:17:29
Numarul de teste nu influenteaza in nici un fel algoritmul de rezolvare :)


Titlul: Răspuns: 128 Curse de cai
Scris de: Paul-Dan Baltescu din Aprilie 01, 2013, 13:38:01
Conteaza, daca vrei sa stii ca algoritmul tau are complexitatea buna. T <= 20, am completat si enuntul.


Titlul: Răspuns: 128 Curse de cai
Scris de: Dragos Martac din Aprilie 04, 2013, 11:06:03
Mersi mult  :) Eu stiu sa fac problema in O(T*n^2)  dar este cam la limita... care este complexitatea buna?


Titlul: Răspuns: 128 Curse de cai
Scris de: Paul-Dan Baltescu din Aprilie 04, 2013, 12:31:01
Da, e ok.


Titlul: Răspuns: 128 Curse de cai
Scris de: Popa Andrei din Decembrie 15, 2013, 18:29:36
Testul nu este suficient de bun. Iau 100 dar pe testul:
2
20 20
20 30
imi da 0 , ar trebui sa-mi dea -200.


Titlul: Răspuns: 128 Curse de cai
Scris de: Potra Vlad din Septembrie 24, 2014, 00:34:35
Pe absolut toate testele care le-am facut imi da bine (si pe cele de pe forum), si tot primesc 0 puncte :angry:. Va rog, veniti cu niste cazuri particulare.

Uitati-va va rog si pe sursa http://www.infoarena.ro/job_detail/1232853?action=view-source (http://www.infoarena.ro/job_detail/1232853?action=view-source)


Titlul: Răspuns: 128 Curse de cai
Scris de: Patrick Sava din Septembrie 24, 2014, 21:34:34
Nu cred ca ai vreo sansa sa scoti problema asta de 100 cu o complexitate mai buna de O ( n ^ 2 ) . Poti incerca o varianta cu dinamica sau o varianta cu un greedy care se vrea a fi mai degraba un brut.  :) Numai bine si succes . Solutia oferita de tine nu cred ca este optima . Cred ca greseala e la nivelul conceptual,nu la nivelul care tine de implementare.


Titlul: Răspuns: 128 Curse de cai
Scris de: Andi Arnautu din Noiembrie 30, 2014, 02:52:04
Frumoasa problema!  :D