Advertisement
a53

Datorii1

a53
Mar 11th, 2020
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.78 KB | None | 0 0
  1. ///Alin Burta 100 puncte
  2. #include <fstream>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cctype>
  6. #define MaxF 3001
  7.  
  8. using namespace std;
  9.  
  10. ifstream citeste("datorii.in");
  11. ofstream scrie("datorii.out");
  12.  
  13. struct firma
  14. {
  15. char nume[21];
  16. long long SP, SD;
  17. };
  18.  
  19. int C, D;
  20. firma v[62][MaxF];
  21. int nrFirme = 0;
  22. int nrF[62] = {0};
  23.  
  24. int apartine(char*);
  25.  
  26. int main()
  27. {
  28. char linie[500], numeFirma1[21], numeFirma2[21];
  29. int i, j;
  30. int suma;
  31. int poz;
  32. firma tmp;
  33. int lista;
  34. //citesc datele de intrare
  35. citeste >> C >> D;
  36. citeste.get();
  37.  
  38. for(i = 1; i <= D; ++i)
  39. {
  40. citeste.get(linie,500);
  41. citeste.get();
  42. //extrageDate(linie, numeFirma1, numeFirma2, suma);
  43.  
  44. //extrag datele
  45. char *cuv,ii;
  46. int z = 1;
  47. ii = strlen(linie) - 1;
  48. suma = 0;
  49. while ( 48 <= linie[ii] && linie[ii] <= 57)
  50. {
  51. suma = suma + z * (linie[ii]-48);
  52. z *= 10;
  53. ii--;
  54. }
  55. ii++;
  56. linie[ii-1] = '\0';
  57. cuv = strchr(linie, '>');
  58. strncpy(numeFirma1, linie, cuv - linie - 1);
  59. numeFirma1[cuv - linie - 1] ='\0';
  60. strcpy(numeFirma2, cuv+2);
  61.  
  62. //pun firmele la locul lor
  63. poz = apartine(numeFirma1);
  64. if(isdigit(numeFirma1[0]))
  65. lista = numeFirma1[0] - '0';
  66. else
  67. if(isupper(numeFirma1[0]))
  68. lista = 10 + numeFirma1[0] - 'A';
  69. else
  70. lista = 36 + numeFirma1[0] - 'a';
  71. if(poz)
  72. v[lista][poz].SD += suma;
  73. else
  74. {
  75. nrFirme++;
  76. nrF[lista]++;
  77. strcpy(v[lista][nrF[lista]].nume,numeFirma1);
  78. v[lista][nrF[lista]].SP = 0;
  79. v[lista][nrF[lista]].SD = suma;
  80. //mut firma la locul ei
  81. for(j = nrF[lista]; j>1 && strcmp(v[lista][j].nume, v[lista][j-1].nume) < 0; j--)
  82. tmp = v[lista][j], v[lista][j] = v[lista][j-1], v[lista][j-1] = tmp;
  83. }
  84. poz = apartine(numeFirma2);
  85. if(isdigit(numeFirma2[0]))
  86. lista = numeFirma2[0] - '0';
  87. else
  88. if(isupper(numeFirma2[0]))
  89. lista = 10 + numeFirma2[0] - 'A';
  90. else
  91. lista = 36 + numeFirma2[0] - 'a';
  92. if(poz)
  93. v[lista][poz].SP += suma;
  94. else
  95. {
  96. nrFirme++;
  97. nrF[lista]++;
  98. strcpy(v[lista][nrF[lista]].nume,numeFirma2);
  99. v[lista][nrF[lista]].SP = suma;
  100. v[lista][nrF[lista]].SD = 0;
  101. //mut firma la locul ei
  102. for(j = nrF[lista]; j>1 && strcmp(v[lista][j].nume, v[lista][j-1].nume) < 0; j--)
  103. tmp = v[lista][j], v[lista][j] = v[lista][j-1], v[lista][j-1] = tmp;
  104. }
  105. }
  106.  
  107. if( C == 1)
  108. {
  109. scrie << nrFirme <<'\n';
  110. }
  111. else
  112. {
  113. for(i = 0; i < 62; ++i)
  114. if(nrF[i])
  115. for(j = 1; j <= nrF[i]; ++j)
  116. scrie << v[i][j].nume << " " << v[i][j].SD << " " << v[i][j].SP << '\n';
  117. }
  118.  
  119. citeste.close();
  120. scrie.close();
  121. return 0;
  122. }
  123.  
  124.  
  125. int apartine(char *denumire)
  126. {
  127. int st, dr, mij;
  128. int lista;
  129. if(isdigit(denumire[0]))
  130. lista = denumire[0] - '0';
  131. else
  132. if(isupper(denumire[0]))
  133. lista = 10 + denumire[0] - 'A';
  134. else
  135. lista = 36 + denumire[0] - 'a';
  136. st = 1; dr = nrF[lista];
  137. while(st <= dr)
  138. {
  139. mij = (st + dr)/2;
  140. if(strcmp(v[lista][mij].nume, denumire) == 0)
  141. return mij;
  142. else
  143. if(strcmp(v[lista][mij].nume, denumire) < 0)
  144. st = mij + 1;
  145. else
  146. dr = mij - 1;
  147. }
  148. return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement