[19] Concurs - Domnul Z

[19] Concurs - Domnul Z

Postby cata45 » 11 Nov 2011, 20:57

Cu acceptul lui new_luca am propus urmatoarea tema pentru concurs. Spor!

Domnul Z, profesorul de limba română de la clasa a IX-a a stabilit cu cei N elevi ai săi temele individuale de documentare şi cercetare, care au fost numerotate cu numere de la 1 la N. După realizarea temelor, acestea vor fi grupate în una sau mai multe reviste care vor participa la concursul revistelor şcolare. Regulamentul concursului prevede ca revista să fie compusă din teme care au elemente comune sau care se „potrivesc”; dacă tema A are elemente comune cu tema B, iar tema B are elemente comune cu tema C, atunci tema A se „potriveşte” cu tema C, astfel cele trei teme pot face parte din aceeaşi revistă.
Cerinţă
Cunoscând n numărul de elevi (implicit numărul de teme), M numărul de perechi de teme care au elemente comune şi temele care au elemente comune să se determine numărul minim de reviste care vor participa la concurs.
Date de intrare
Fişierul de intrare bitcell19.in conţine pe prima linie numerele naturale N şi M separate prin câte un spaţiu. Pe următoarele M linii se află câte două numere naturale A B cu semnificaţia „tema A are elemente comune cu tema B”.
Date de iesire
Fişierul de ieşire bitcell19.out va conţine o singură linie pe care va fi scris un număr natural reprezentând numărul minim de reviste care se vor realiza.
Restrictii si precizari
• 1 ≤ N ≤ 300
• 1 ≤ A, B ≤ N
• 0 ≤ M ≤ 32000
• Perechile A B din fişierul de intrare sunt distincte.
Exemple
bitcell19.in

bitcell19.out

Explicatii
Temele 1 şi 2 au elemente comune, la fel şi temele 2, 3 atunci 1 şi 3 se potrivesc , astfel temele 1, 2, 3 vor face parte din aceeaşi revistă.
temele 4 şi 5 au elemente comune, la fel şi temele 4, 6 atunci 5 şi 6 se potrivesc , astfel temele 4, 5, 6 vor face parte din aceeaşi revistă.
Numărul minim de reviste va fi 2.

Data inceput : 10/11/2011
Data finalizare: 20/11/2011
Desemnare castigator: 21/11/2011
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby cata45 » 14 Nov 2011, 21:16

Solutia mea - in atasament.

Avand in vedere ca particip si eu la concurs, sper ca are altcineva timp sa jurizeze. :)
0,0p / 0 votes
Attachments
bitcell19_cata45.zip
(25.83 KiB) Downloaded 7 times
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby new_luca » 16 Nov 2011, 10:38

Particip si eu, sper sa fie functionala solutia : Download

Presupun ca fiecare elev/tema apare cel putin 1 data printre cele M perechi (adica are un element comun cu o alta tema).
0,0p / 0 votes
Image
User avatar
new_luca
Byte
 
Joined: 03 Jul 2011
Location: Gaesti
Status: 12

Re: [19] Concurs - Domnul Z

Postby cata45 » 16 Nov 2011, 14:14

NU e obligatoriu ca fiecare tema sa aiba elemente comune cu alta. Alt exemplu:

Tema 1 are elemte comune cu 2. Tema 2 are elemte comune cu 3. Deci temele 1 2 3 fac parte din primul grup.
Temele 4 5 6 sunt fiecare in grupul lor pentru ca nu au legaturi cu alte teme. In total vor fi 4 grupuri

primul grup : 1 2 3
al II-lea grup: 4
al III-lea grup: 5
al IV-lea grup: 6
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby new_luca » 16 Nov 2011, 18:06

Mi-am revizuit rezolvarea : Download .

Nu imi dau seama daca am greseli, daca cineva gaseste vreo intrare pe care nu merge bine programul va rog sa ma anuntati.

Catalin pana la urma pe tine ramane povara jurizarii? Ca sa stiu cui ii trimit codul sursa.
0,0p / 0 votes
Image
User avatar
new_luca
Byte
 
Joined: 03 Jul 2011
Location: Gaesti
Status: 12

Re: [19] Concurs - Domnul Z

Postby cata45 » 16 Nov 2011, 19:29

da...il jurizez eu. Poti descarca solutia mea de mai sus si sa iti verifici sursa pe un set mai variat de teste.
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby Mihai » 20 Nov 2011, 18:18

M-am înscris și eu în concurs, dar cum nu am acces la o mașină cu Windows nu cred că are rost să postez rezultatul aici - i-am trimis un mesaj privat lui Cătălin cu sursa, totuși.
Sper că-i ok rezolvarea, recunosc că n-am testat pe vreun alt exemplu în afară de cel dat de Cătălin în enunț :)).
0,0p / 0 votes
User avatar
Mihai
Byte
 
Joined: 29 Dec 2009
Status: 25

Re: [19] Concurs - Domnul Z

Postby nomemory » 20 Nov 2011, 18:27

Solutia mea e aici .
Sursa am trimis-o ca mesaj privat .
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2

Re: [19] Concurs - Domnul Z

Postby cata45 » 20 Nov 2011, 22:03

Am primit sursele tuturor. Le-am si evaluat. Voi posta rezultatele astazi dupa ora 20:30 deoarece maine nu am timp. Sper ca nu se supara nimeni. (Banuiesc ca nu a ramas nimeni cu implementarea pe ultima suta de metrii) %%-


L.E. (-- 20 Nov 2011, 22:03 --)

Am supus sursele pe un set de 10 teste. Iata rezultatele:

nomemory
  1. TEST     |    TIMP       |  MESAJ EVALUATOR    |    PUNCTE
  2. __________________________________________________
  3.    1             0                     ok                            10
  4.    2             0.04                ok                            10
  5.    3             0.07                ok                            10
  6.    4             0.23                ok                            10
  7.    5             0                     ok                            10
  8.    6             0                     ok                            10
  9.    7             0                     ok                            10
  10.    8             0                     ok                            10
  11.    9             0                     ok                            10
  12.    10           0                     ok                            10
  13. TOTAL  EVALUARE                                                 100
  14.  

new_luca
  1. TEST     |    TIMP       |  MESAJ EVALUATOR    |    PUNCTE
  2. __________________________________________________
  3.    1             0                     ok                            10
  4.    2             0                     wa                            0
  5.    3             0.02                wa                            0
  6.    4             0.05                wa                            0
  7.    5             0                     ok                            10
  8.    6             0                     wa                            0
  9.    7             0                     wa                            0
  10.    8             0                     wa                            0
  11.    9             0                     wa                            0
  12.    10           0                     wa                            0
  13. TOTAL  EVALUARE                                             20
  14.  

Mihai
  1. TEST     |    TIMP       |  MESAJ EVALUATOR    |    PUNCTE
  2. __________________________________________________
  3.    1             0                     ok                            10
  4.    2             0.05                ok                            10
  5.    3             0.09                ok                            10
  6.    4             0.17                ok                            10
  7.    5             0                     ok                            10
  8.    6             0                     ok                            10
  9.    7             0                     ok                            10
  10.    8             0                     ok                            10
  11.    9             0.01                ok                            10
  12.    10           0                     ok                            10
  13. TOTAL  EVALUARE                                           100
  14. Depunctat pentru eroare remediata. (line 21: syntax error before 'for' )  -10 p
  15. TOTAL                                                                    90
  16.  

cata45
  1. TEST     |    TIMP       |  MESAJ EVALUATOR    |    PUNCTE
  2. __________________________________________________
  3.    1             0                     ok                            10
  4.    2             0                     ok                            10
  5.    3             0                     ok                            10
  6.    4             0                     ok                            10
  7.    5             0                     ok                            10
  8.    6             0                     ok                            10
  9.    7             0                     ok                            10
  10.    8             0                     ok                            10
  11.    9             0                     ok                            10
  12.    10           0                     ok                            10
  13. TOTAL  EVALUARE                                                 100
  14.  


Surse:
nomemory
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <stack>
  4. #include <vector>
  5.  
  6. #define N_MIN 1
  7. #define N_MAX 301
  8. #define M_MIN 0
  9. #define M_MAX 32000
  10.  
  11. using namespace std;
  12.  
  13. const char * INPUT_FILE = "bitcell19.in";
  14. const char * OUTPUT_FILE = "bitcell19.out";
  15.  
  16. bool read_input_file(const char *input_file, bool (*graph)[N_MAX], int &N)
  17. {
  18.     int M = 0, A = 0, B = 0;
  19.    
  20.     FILE *input = fopen(input_file, "r");
  21.     if (!input) {
  22.         fprintf(stderr, "Cannot read file: %s .\n", input_file);
  23.         return false;
  24.     }
  25.    
  26.     fscanf(input, "%d %d", &N, &M);
  27.     if (N_MIN > N || N >= N_MAX) {
  28.         fprintf(stderr, "Invalid N value: %d (%d <= N <= %d) .\n", N, N_MIN, N_MAX-1);
  29.         return false;
  30.     }
  31.     if (M_MIN > M || M > M_MAX) {
  32.         fprintf(stderr, "Invalid M value: %d (%d <= M <= %d) .\n", M, M_MIN, M_MAX);
  33.         return false;
  34.     }
  35.    
  36.     for(int i = 0; i < M; i++) {
  37.         fscanf(input, "%d %d", &A, &B);
  38.         if(N_MIN > A || A >= N_MAX || N_MIN > B || B >= N_MAX) {
  39.             fprintf(stderr, "Invalid values for A (%d) or B(%d)", A, B);
  40.         }
  41.         graph[A][B] = true;
  42.         graph[B][A] = true;
  43.     }
  44.  
  45.     fclose(input);
  46.    
  47.     return true;
  48. }
  49.  
  50. void solution(const bool (*graph)[N_MAX], const int N, int &result)
  51. {
  52.     vector<bool> visited(N_MAX, false);
  53.     int cidx = 0;
  54.     for(int i = N_MIN; i <= N; ++i) {
  55.         if(!visited[i]) {
  56.             stack<int> idx;
  57.             idx.push(i);
  58.             while(!idx.empty()) {
  59.                 cidx = idx.top();
  60.                 idx.pop();
  61.                 visited[cidx] = true;
  62.                 for(int j = N_MIN; j <= N; ++j) {
  63.                     if(graph[cidx][j] == 1 && visited[j]==false) {
  64.                         idx.push(j);
  65.                     }
  66.                 }
  67.             }
  68.             result++;
  69.         }
  70.     }
  71. }
  72.  
  73. bool write_output_file(const char *output_file, const int result)
  74. {
  75.     FILE *output = fopen(output_file, "w");
  76.    
  77.     if(!output) {
  78.         fprintf(stderr, "Cannot write file: %s .\n", output_file);
  79.         return false;        
  80.     }
  81.    
  82.     fprintf(output, "%d", result);
  83.    
  84.     fclose(output);
  85.    
  86.     return true;
  87. }
  88.  
  89. int main(int argc, char *argv[])
  90. {
  91.     int N = 0, result = 0;
  92.     bool graph[N_MAX][N_MAX];
  93.    
  94.     if(!read_input_file(INPUT_FILE, graph, N)) {
  95.         return 1;
  96.     }  
  97.     solution(graph, N, result);
  98.     if(!write_output_file(OUTPUT_FILE, result)) {
  99.         return 1;
  100.     }
  101.    
  102.     return 0;
  103. }

Mihai
  1. /*
  2.    Problema 19 - Bitcell - Domnul Z
  3.    Rezolvarea problemei consta in determinarea numarului de componente conexe ale unui graf cu N varfuri si M muchii
  4. */
  5.  
  6. #include <fstream>
  7. #include <vector>
  8. #include <bitset>
  9.  
  10. #define PROBLEMA "bitcell19"
  11. #define NMAX 305
  12.  
  13. using namespace std;
  14. ifstream in(PROBLEMA ".in");
  15. ofstream out(PROBLEMA ".out");
  16.  
  17. bitset<NMAX> folositDFS;
  18. void marcareConexe(vector<int> graf[], int tata)
  19. {
  20.   folositDFS[tata]=true
  21.   for(vector<int>::iterator i=graf[tata].begin();i!=graf[tata].end();++i)
  22.     if(!folositDFS[*i])
  23.       marcareConexe(graf,*i);
  24. }
  25.  
  26. int main()
  27. {
  28.   int N,M,contor=0;
  29.   vector<int> graf[NMAX];
  30.   bitset<NMAX> folosit[NMAX];
  31.  
  32.   //citim graful
  33.   in>>N>>M;
  34.   for(int i=1;i<=M;++i)
  35.   {
  36.     int s,d;
  37.     in>>s>>d;
  38.     if(!folosit[s][d])
  39.     {
  40.       folosit[d][s]=folosit[s][d]=true;
  41.       graf[s].push_back(d);
  42.       graf[d].push_back(s);
  43.     }
  44.   }
  45.  
  46.   //determinam numarul de componente conexe
  47.   for(int i=1;i<=N;i++)
  48.     if(!folositDFS[i])
  49.       marcareConexe(graf,i),
  50.       contor++;
  51.  
  52.   //afisam numarul de componente conexe
  53.   out<<contor<<endl;
  54.  
  55.   in.close();
  56.   out.close();
  57.   return 0;
  58. }

new_luca
  1. #include <stdio.h>
  2.  
  3. int main(void)
  4. {
  5.     short v[301] = {0}, i, j;
  6.     int n, indice = 1, a, b, indici_distrusi = 1;                                    
  7.     long m;                                  
  8.    
  9.     freopen("bitcell19.in", "r", stdin);
  10.     freopen("bitcell19.out", "w", stdout);
  11.    
  12.     scanf("%d %d", &n, &m);n++;
  13.    
  14.     for(i = 0;i < m;i++)
  15.     {
  16.         scanf("%d %d", &a, &b);
  17.        
  18.         if(!v[a] && !v[b])                    
  19.         {
  20.             v[a] = v[b] = indice;
  21.             indice++;
  22.         }
  23.         else      
  24.         {
  25.             if(v[a])              
  26.             {
  27.                 if(!v[b])v[b] = v[a];    
  28.                 else                      
  29.                 {
  30.                     for(j = 1;j < n;j++)
  31.                     {
  32.                         if(v[j] == v[a])v[j] = v[b];
  33.                     }
  34.                     indici_distrusi++;
  35.                 }
  36.             }
  37.             else              
  38.             {
  39.                 if(v[b])v[a] = v[b];
  40.             }
  41.         }
  42.     }
  43.    
  44.     for(i = 1;i < n;i++)
  45.     {
  46.         if(v[i] == 0)indice++;
  47.     }
  48.    
  49.     printf("%d", indice-indici_distrusi);
  50.  
  51.     return 0;
  52. }


cata45
  1. #include<fstream>
  2. using namespace std;
  3. #define IN "bitcell19.in"
  4. #define OUT "bitcell19.out"
  5. FILE *f, *g;
  6. int x, y, i, n, m, a[305][305], cmp, v[305];
  7. void BFS(int v[305], int cmp, int s)
  8. {
  9.     int coada[305], i, p, u;
  10.     for(i=1; i<=n; i++)
  11.         coada[i]=0;
  12.     p=1; u=1;
  13.     coada[p]=s;
  14.     v[s]=cmp;
  15.     while(p<=u)
  16.     {
  17.         for(i=1; i<=n; i++)
  18.         {
  19.             if(a[i][coada[p]]==1 && v[i]==0)
  20.             {
  21.                 u++;
  22.                 coada[u]=i;
  23.                 v[i]=cmp;
  24.             }
  25.         }
  26.         p++;
  27.     }
  28. }
  29. int valid(int v[305])
  30. {
  31.     int i;
  32.     for(i=1; i<=n; i++)
  33.         if(v[i]==0)
  34.             return i;
  35.     return -1;
  36. }
  37. int main()
  38. {
  39.     f=fopen(IN, "r");
  40.     g=fopen(OUT, "w");
  41.     fscanf(f, "%d %d", &n, &m);
  42.     for(i=1; i<=m; i++)
  43.     {
  44.         fscanf(f, "%d %d", &x, &y);
  45.         a[x][y]=1;
  46.         a[y][x]=1;
  47.     }
  48.     cmp=1;
  49.     BFS(v,cmp, 1);
  50.  
  51.     x=valid(v);
  52.     while(x!=-1)
  53.     {
  54.         cmp++;
  55.         BFS(v,cmp,x);
  56.         x=valid(v);
  57.     }
  58.     fprintf(g, "%d\n", cmp);
  59.     fclose(f);
  60.     fclose(g);
  61.     return 0;
  62.  
  63. }


Castigatorul este :
Offtopic
Felicitari! Te asteptam cu noua tema de concurs! :)
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby new_luca » 20 Nov 2011, 22:24

Brava baieti :p

@cata45, mai ai idee care erau intrarile pentru teste :D sunt curios ce am gresit la ideea mea, sa incerc o remediez, ar fi pacat la cat mi-am stors creierul :)) sa nu ii dau de cap.

Iar in legatura cu celelalte coduri :)) DAMN! stiu ca inca nu am inteles nici unul, dar inca incerc.

Peace :)>-
0,0p / 0 votes
Image
User avatar
new_luca
Byte
 
Joined: 03 Jul 2011
Location: Gaesti
Status: 12

Re: [19] Concurs - Domnul Z

Postby cata45 » 20 Nov 2011, 22:49

Testele au fost generate random si nu le mai am. Defapt nici nu le-am stiut. Ideea era sa faci un graf si sa pui muchii intre temele cu elemente in comun. In acest graf se formau niste componente. Si tot ce trebuia sa faci era sa determini numarul de componente conexe.


L.E. (-- 20 Nov 2011, 22:49 --)

Plus ca intrarile pe care au fost testate solutiile erau huge. Nu cred ca ai fi avut rabdare sa iti testezi solutia pe un test cu cateva zeci de mii de numere.
0,0p / 0 votes
The EARTH without ART is just EH.
User avatar
cata45
Byte
 
Joined: 02 Sep 2010
Status: 9

Re: [19] Concurs - Domnul Z

Postby new_luca » 20 Nov 2011, 23:21

Ce nasol e ca nu stiu nici chestii d-astea de baza "Grafuri" :)), nu stiu prea bine ce sunt, trebuie sa le studiez...

Eu am facut o rezolvare "artificiala" din capul meu, dar se pare ca ceva a mers gresit :D, eu mai facusem cu executabilul tau teste dar nu am avut noroc sa gasesc bube :p

- vector cu 300 componente pentru fiecare copil/tema posibila initializat cu 0
- un indice initializat cu 1 si care ar creste cu 1 de fiecare data cand intalneste o tema noua( ambele pozitii din vector = 0)
- citesc cele m perechi pe rand si daca vectorii corespunzatori sunt egali cu 0 amandoi, cresc indicele si il tin minte pe cele 2 pozitii din vector
- daca pozitiile din vector sunt diferite de 0, daca e doar una e bine, in cea = 0 pun indicele diferit de 0, iar daca ambele sunt diferite de 0, distrug unul din indici peste tot in vector si il pun pe celalalt
- tin minte de cate ori am distrus indici
- si raspunsul ar trebui sa fie valoarea maxima a indicelui fara numarul de indici distrusi

Daca a inteles cineva ce am spus aici :)) sunt bucuros, poate are si logica...la mine in cap cel putin ar avea, poate e gresit dar nu imi dau seama inca.

Imi pare rau ca sunt asa obositor :p, dar asta sunt :-bd
0,0p / 0 votes
Image
User avatar
new_luca
Byte
 
Joined: 03 Jul 2011
Location: Gaesti
Status: 12

Re: [19] Concurs - Domnul Z

Postby nomemory » 21 Nov 2011, 00:30

^^^Multumesc
:"> Me => Happy

Ma puteti pasui pana maine sau cel mai tarziu Marti cu noua tema de concurs ?
0,0p / 0 votes
User avatar
nomemory
Bit
 
Joined: 24 Aug 2011
Location: Bucuresti
Status: 2


Return to Concursuri de programare desktop

Who is online

Users browsing this forum: No registered users and 0 guests

cron