Advertisement
a53

John_cu_set

a53
Dec 27th, 2020 (edited)
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <set>
  3. using namespace std;
  4. int n,m,x;
  5. set<int> A[1001],S; /// A=matricea ce retine datele de intrare
  6. set<int>::iterator it,jt;
  7.  
  8. int pecatelinii(int x) /// Cauta pe toate liniile daca exista elementul x si le numara
  9. {
  10. int c=0; /// Numarul de linii pe care se afla elementul x
  11. for(int i=0;i<n;++i)
  12. if(A[i].find(x)!=A[i].end())
  13. ++c;
  14. return c;
  15. }
  16.  
  17. int intersectie(int Li,int Lj) /// Calculeaza numarul de elemente din intersectia a doua linii Li si Lj
  18. {
  19. int k=0; /// Numarul de elemente din intersectie
  20. it=A[Li].begin(),jt=A[Lj].begin();
  21. while(it!=A[Li].end()&&jt!=A[Lj].end())
  22. {
  23. if(*it<*jt)
  24. ++it;
  25. else
  26. if(*jt<*it)
  27. ++jt;
  28. else /// Daca elementele sunt egale, atunci fac parte din intersectie
  29. ++k,++it,++jt;
  30. }
  31. return k;
  32. }
  33.  
  34. #define DIM 1280000
  35. char buff[DIM];
  36. int poz=0;
  37. void citeste(int &numar) /// Parsarea numerelor naturale
  38. {
  39. numar=0;
  40. while(buff[poz]<'0'||buff[poz]>'9') /// cat timp caracterul din buffer nu e cifra ignor
  41. if(++poz==DIM) ///daca am "golit" bufferul atunci il umplu
  42. fread(buff,1,DIM,stdin),poz=0;
  43. while('0'<=buff[poz]&&buff[poz]<='9') /// cat timp dau de o cifra recalculez numarul
  44. {
  45. numar=numar*10+buff[poz]-'0';
  46. if(++poz==DIM)
  47. fread(buff,1,DIM,stdin),poz=0;
  48. }
  49. }
  50.  
  51. int main()
  52. {
  53. ios_base::sync_with_stdio(false);
  54. cin.tie(0);
  55. cout.tie(0);
  56. citeste(n),citeste(m); /// Aici citesc
  57. for(int i=0;i<n;++i) /// datele de intrare
  58. for(int j=0;j<m;++j)
  59. citeste(x),A[i].insert(x),S.insert(x); /// S retine casele
  60. int NrMaxM=0; /// Numarul maxim de muncitori care lucreaza la aceeasi casa
  61. for(it=S.begin();it!=S.end();++it) /// Parcurg toate casele si aflu numarul maxim de aparitii pe linii
  62. NrMaxM=max(NrMaxM,pecatelinii(*it)); /// Aflu de cate ori acea casa se afla pe linii
  63. int NrMaxC=0; /// Numarul Maxim ce case la care lucreaza simultan 2 muncitori
  64. for(int i=0;i<n-1;++i)
  65. for(int j=i+1;j<n;++j)
  66. NrMaxC=max(intersectie(i,j),NrMaxC); /// intersectia=nr de case la care lucreaza simultan muncitoii i si j
  67. cout<<NrMaxM<<'\n'<<NrMaxC;
  68. return 0;
  69. }
  70.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement