Advertisement
Guest User

Untitled

a guest
Nov 20th, 2017
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.82 KB | None | 0 0
  1. // TEMA 2 TAP.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8. #include <algorithm>
  9. #include <iomanip>
  10. using namespace std;
  11.  
  12. // aici incepe problema 1
  13.  
  14. struct nod {
  15. string valoareCitita;
  16. nod * fiuStanga;
  17. nod * fiuDreapta;
  18. int numar = 0;
  19. };
  20.  
  21. bool esteArboreDeCautare(nod * parinte, int &prev) {
  22. string valoareCititaTastatura;
  23. cin >> valoareCititaTastatura;
  24. if (valoareCititaTastatura != "null") {
  25. nod* fiuStanga = new nod;
  26. fiuStanga->numar = atoi(valoareCititaTastatura.c_str()); //converteste string in numar
  27. parinte->fiuStanga = fiuStanga;
  28.  
  29. if (!esteArboreDeCautare(fiuStanga,prev))
  30. return false;
  31. }
  32. if (prev > parinte->numar)
  33. return false;
  34.  
  35. prev = parinte->numar;
  36.  
  37. cin >> valoareCititaTastatura;
  38. if (valoareCititaTastatura != "null") {
  39. nod* fiuDreapta = new nod;
  40. fiuDreapta->numar = atoi(valoareCititaTastatura.c_str()); //converteste string in numar
  41. parinte->fiuDreapta = fiuDreapta;
  42.  
  43. return esteArboreDeCautare(fiuDreapta, prev);
  44. }
  45. return true;
  46. }
  47.  
  48. void verificareArboreBinarCautare() {
  49. string valoareCititaTastatura;
  50. cin >> valoareCititaTastatura;
  51. if (valoareCititaTastatura == "null") {
  52. cout << "Arborele este null\n";
  53. return;
  54. }
  55. nod * radacina = new nod;
  56. radacina->valoareCitita = valoareCititaTastatura;
  57. radacina->numar = atoi(valoareCititaTastatura.c_str()); //converteste string in numar
  58.  
  59. int prev=INT_MIN;
  60. if (esteArboreDeCautare(radacina, prev))
  61. cout << "da\n";
  62. else
  63. cout << "nu\n";
  64. }
  65.  
  66. // aici incepe problema 2
  67.  
  68. struct Gaura {
  69. int i, j;
  70. Gaura(int setI=0, int setJ=0) : i(setI), j(setJ) {}
  71. };
  72.  
  73. void acopera(int sus, int st, int latura, Gaura gauraCurenta, int & contorPiesa, vector <vector <int > > & tabla, int n) {
  74. //conditia pentru terminare (latura <= 2) e trecuta in fiecare caz
  75. //practic nu se mai reapeleaza, piesa adaugata acoperind in totalitate tabla de lungime 2
  76.  
  77. int laturaNoua = latura >> 1; // latura / 2
  78.  
  79. if ((gauraCurenta.i - sus) < laturaNoua) {
  80. //gaura este in jumatatea superioara
  81. if (gauraCurenta.j - st < laturaNoua) {
  82. //gaura este in jumatatea stanga
  83. //gaura este in contul stanga sus
  84. Gaura g1, g2, g3;
  85. g1.i = sus + laturaNoua; g1.j = st + laturaNoua - 1;
  86. g2.i = sus + laturaNoua; g2.j = st + laturaNoua;
  87. g3.i = sus + laturaNoua - 1; g3.j = st + laturaNoua;
  88.  
  89. tabla[g1.i][g1.j] += contorPiesa;
  90. tabla[g2.i][g2.j] += contorPiesa;
  91. tabla[g3.i][g3.j] += contorPiesa;
  92. ++contorPiesa;
  93.  
  94. /*for (int i = 1; i <= n; ++i) {
  95. for (int j = 1; j <= n;++j)
  96. cout << setw(3) << tabla[i][j] << " ";
  97. cout << "\n";
  98. }
  99. cout << "\n";*/
  100.  
  101. if (latura == 2)
  102. return;
  103.  
  104. acopera(sus, st, laturaNoua, gauraCurenta, contorPiesa, tabla, n);
  105. acopera(sus + laturaNoua, st, laturaNoua, g1, contorPiesa, tabla, n);
  106. acopera(sus + laturaNoua, st + laturaNoua, laturaNoua, g2, contorPiesa, tabla, n);
  107. acopera(sus, st + laturaNoua, laturaNoua, g3, contorPiesa, tabla, n);
  108.  
  109. }
  110. else {
  111. //gaura este in jumatatea dreapta
  112. //gaura este in contul dreapta sus
  113. Gaura g1, g2, g3;
  114. g1.i = sus + laturaNoua; g1.j = st + laturaNoua - 1;
  115. g2.i = sus + laturaNoua; g2.j = st + laturaNoua;
  116. g3.i = sus + laturaNoua - 1; g3.j = st + laturaNoua - 1;
  117.  
  118. tabla[g1.i][g1.j] += contorPiesa;
  119. tabla[g2.i][g2.j] += contorPiesa;
  120. tabla[g3.i][g3.j] += contorPiesa;
  121. ++contorPiesa;
  122.  
  123. /*for (int i = 1; i <= n; ++i) {
  124. for (int j = 1; j <= n;++j)
  125. cout << setw(3) << tabla[i][j] << " ";
  126. cout << "\n";
  127. }
  128. cout << "\n";*/
  129.  
  130. if (latura == 2)
  131. return;
  132.  
  133. acopera(sus, st + laturaNoua, laturaNoua, gauraCurenta, contorPiesa, tabla, n);
  134. acopera(sus + laturaNoua, st, laturaNoua, g1, contorPiesa, tabla, n);
  135. acopera(sus + laturaNoua, st + laturaNoua, laturaNoua, g2, contorPiesa, tabla, n);
  136. acopera(sus, st, laturaNoua, g3, contorPiesa, tabla, n);
  137. }
  138. }
  139. else {
  140. //gaura este in jumatatea inferioara
  141. if (gauraCurenta.j - st < laturaNoua) {
  142. //gaura este in jumatatea stanga
  143. //gaura este in contul stanga jos
  144. Gaura g1, g2, g3;
  145. g1.i = sus + laturaNoua - 1; g1.j = st + laturaNoua - 1;
  146. g2.i = sus + laturaNoua; g2.j = st + laturaNoua;
  147. g3.i = sus + laturaNoua - 1; g3.j = st + laturaNoua;
  148.  
  149. tabla[g1.i][g1.j] += contorPiesa;
  150. tabla[g2.i][g2.j] += contorPiesa;
  151. tabla[g3.i][g3.j] += contorPiesa;
  152. ++contorPiesa;
  153.  
  154. /*for (int i = 1; i <= n; ++i) {
  155. for (int j = 1; j <= n;++j)
  156. cout << setw(3) << tabla[i][j] << " ";
  157. cout << "\n";
  158. }
  159. cout << "\n";*/
  160.  
  161. if (latura == 2)
  162. return;
  163.  
  164. acopera(sus + laturaNoua, st, laturaNoua, gauraCurenta, contorPiesa, tabla, n);
  165. acopera(sus, st, laturaNoua, g1, contorPiesa, tabla, n);
  166. acopera(sus + laturaNoua, st + laturaNoua, laturaNoua, g2, contorPiesa, tabla, n);
  167. acopera(sus, st + laturaNoua, laturaNoua, g3, contorPiesa, tabla, n);
  168. }
  169. else {
  170. //gaura este in jumatatea dreapta
  171. //gaura este in contul dreapta jos
  172. Gaura g1, g2, g3;
  173. g1.i = sus + laturaNoua - 1; g1.j = st + laturaNoua - 1;
  174. g2.i = sus + laturaNoua; g2.j = st + laturaNoua - 1;
  175. g3.i = sus + laturaNoua - 1; g3.j = st + laturaNoua;
  176.  
  177. tabla[g1.i][g1.j] += contorPiesa;
  178. tabla[g2.i][g2.j] += contorPiesa;
  179. tabla[g3.i][g3.j] += contorPiesa;
  180. ++contorPiesa;
  181.  
  182. /*for (int i = 1; i <= n; ++i) {
  183. for (int j = 1; j <= n;++j)
  184. cout << setw(3) << tabla[i][j] << " ";
  185. cout << "\n";
  186. }
  187. cout << "\n";*/
  188.  
  189. if (latura == 2)
  190. return;
  191.  
  192. acopera(sus + laturaNoua, st + laturaNoua, laturaNoua, gauraCurenta, contorPiesa, tabla, n);
  193. acopera(sus, st, laturaNoua, g1, contorPiesa, tabla, n);
  194. acopera(sus + laturaNoua, st, laturaNoua, g2, contorPiesa, tabla, n);
  195. acopera(sus, st + laturaNoua, laturaNoua, g3, contorPiesa, tabla, n);
  196. }
  197. }
  198. }
  199.  
  200. void jocGasireGaura() {
  201. int putere;
  202. cin >> putere;
  203.  
  204. int n = 1 << putere; //2 ^ putere
  205.  
  206. Gaura gauraInitiala;
  207.  
  208. cin >> gauraInitiala.i;
  209. cin >> gauraInitiala.j;
  210.  
  211. vector < vector <int> > tabla;
  212. for (int i = 0; i <= n; ++i) {
  213. vector <int> nouVector(n + 1, 1);
  214. tabla.push_back(nouVector);
  215. }
  216.  
  217. tabla[gauraInitiala.i][gauraInitiala.j] = 0;
  218.  
  219. int contorPiesa = 0;
  220.  
  221. acopera(1, 1, n, gauraInitiala, contorPiesa, tabla, n);
  222.  
  223. cout << "Final\n";
  224. for (int i = 1; i <= n; ++i) {
  225. for (int j = 1; j <= n;++j)
  226. cout << setw(3) << tabla[i][j] << " ";
  227. cout << "\n";
  228. }
  229. cout << "\n";
  230. }
  231.  
  232. // aici incepe problema 3
  233.  
  234. struct elementPonderat {
  235. static double pondereTotala;
  236. int numar=0;
  237. double pondere=0;
  238. };
  239.  
  240. double elementPonderat::pondereTotala = 0;
  241.  
  242. //gaseste al k-lea element din vectorul sortat in timp liniar worst case
  243. //
  244. int alKleaEl(vector <elementPonderat> &v, int st, int dr, int pozCautataK) {
  245. if (st==dr)
  246. return v[st].numar;
  247.  
  248. //impartim vectorul nostru in grupuri de cate 5 si gasim cate o mediana pt fiecare sortandu le
  249. // O(n)
  250. vector <elementPonderat> mediane;
  251. int i = st;
  252. while (i + 5 <= dr) {
  253. vector <int> grupDe5;
  254. for (int j = 0; j < 5; ++j) {
  255. grupDe5.push_back(v[i+j].numar);
  256. }
  257. sort(grupDe5.begin(), grupDe5.end()); //sortarea dureaza timp constant pt 5 elemente
  258. elementPonderat nouElementPonderat;
  259. nouElementPonderat.numar = grupDe5[2];
  260. mediane.push_back(nouElementPonderat);
  261. i += 5;
  262. }
  263. if (i <= dr) {
  264. //pt ultimul grup (mai mic de 5) nu conteaza pe care o luam
  265. elementPonderat nouElementPonderat;
  266. nouElementPonderat.numar = v[i].numar;
  267. mediane.push_back(nouElementPonderat);
  268. }
  269.  
  270. //alegem pivotul aplicand gasirea medianei pe medianele grupurilor de cate 5 elemente
  271. int pivot = alKleaEl(mediane,0,mediane.size()-1,mediane.size()/2);
  272.  
  273. //gasim pozitia pivotului
  274. for (int i = st; i<dr; i++) {
  275. if (v[i].numar == pivot) {
  276. swap(v[i], v[dr]);
  277. break;
  278. }
  279. }
  280.  
  281. //aplicam partitionarea dupa pivot
  282. int stanga = st;
  283. for (int i = st; i<dr; i++) {
  284. if (v[i].numar < pivot) {
  285. swap(v[i], v[stanga++]);
  286. }
  287. }
  288. swap(v[stanga], v[dr]);
  289.  
  290. //Daca pivotul nu este raspunsul apelam recursiv in stanga sau in dreapta pivotului
  291. if (stanga == pozCautataK) {
  292. return pivot;
  293. }
  294. else if (stanga > pozCautataK) {
  295. return alKleaEl(v, st, stanga, pozCautataK);
  296. }
  297. else {
  298. return alKleaEl(v, stanga+1, dr, pozCautataK);
  299. }
  300. }
  301.  
  302. // T(n) = T(n/2) + O(n) -> O(n) conform Master
  303. int pozMedPond (vector <elementPonderat> & v , int st, int dr, double pondereAuxSt) {
  304. if (st == dr)
  305. return st;
  306.  
  307. int medianaSimpla = alKleaEl(v, st, dr, (st+dr)/2); // O(n)
  308.  
  309. // total calcul sume O(n)
  310. double sumStanga = 0;
  311. int i;
  312. for (i = st; v[i].numar != medianaSimpla; ++i) {
  313. sumStanga += v[i].pondere;
  314. }
  315. double sumDreapta = 0;
  316. for (int j=i; j<=dr; ++j) {
  317. sumDreapta += v[j].pondere;
  318. }
  319.  
  320. // Reapelul se face in O(n/2)
  321. if (pondereAuxSt + sumStanga >= 0.5) {
  322. //v[i - 1].pondere += sumDreapta+v[i].pondere; //adaugam pondere pt pastrearea problemei initiale
  323. return pozMedPond(v, st, i - 1, pondereAuxSt);
  324. }
  325. else {
  326. //v[i + 1].pondere += sumStanga + v[i].pondere; //adaugam pondere pt pastrearea problemei initiale
  327. return pozMedPond(v, i + 1, dr, pondereAuxSt + sumStanga + v[i].pondere);
  328. }
  329. }
  330.  
  331. void medianaPonderata() {
  332. int n;
  333. cin >> n;
  334. vector <elementPonderat> v;
  335. for (int i = 0; i < n; ++i) {
  336. elementPonderat nouElementPonderat;
  337. cin >> nouElementPonderat.numar;
  338. v.push_back(nouElementPonderat);
  339. }
  340. for (int i = 0; i < n; ++i) {
  341. cin >> v[i].pondere;
  342. elementPonderat::pondereTotala += v[i].pondere;
  343. }
  344. int mp = pozMedPond(v, 0, v.size() - 1,0);
  345. cout << v[mp].numar <<"\n";
  346. }
  347.  
  348. // aici incepe problema 4
  349.  
  350. struct punct {
  351. int x = 0;
  352. int y = 0;
  353. };
  354.  
  355. double distEuclid(punct a, punct b) {
  356. double x = a.x - b.x;
  357. double y = a.y - b.y;
  358. double dist;
  359.  
  360. dist = pow(x, 2) + pow(y, 2); //calculating distance by euclidean formula
  361. dist = sqrt(dist); //sqrt is function in math.h
  362.  
  363. return dist;
  364. }
  365.  
  366. bool cmpDupaX(const punct& a, const punct& b)
  367. {
  368. return a.x < b.x;
  369. }
  370.  
  371. bool cmpDupaY(const punct& a, const punct& b)
  372. {
  373. return a.y < b.y;
  374. }
  375.  
  376.  
  377. double distMinPunctePlanRec(vector <punct> & puncte, int st, int dr, vector<punct> &puncteY) {
  378. if (dr - st == 1) {
  379. return 2147483647; //int_max
  380. }
  381. if (dr - st == 2) {
  382. if (puncteY[st].y > puncteY[st + 1].y)
  383. swap(puncteY[st], puncteY[st + 1]);
  384. return distEuclid(puncte[0], puncte[1]);
  385. }
  386.  
  387. int m = (st + dr) / 2;
  388. double distStanga = distMinPunctePlanRec(puncte, st, m, puncteY);
  389. double distDreapta = distMinPunctePlanRec(puncte, m, dr, puncteY);
  390. double distMinStDr = min(distStanga, distDreapta);
  391.  
  392. //sort(puncteY.begin()+st,puncteY.begin()+dr, cmpDupaY);
  393. vector <punct> puncteAux(dr - st);
  394. merge(puncteY.begin() + st, puncteY.begin() + m, puncteY.begin() + m, puncteY.begin() + dr, puncteAux.begin(), cmpDupaY);
  395. copy(puncteAux.begin(), puncteAux.begin() + (dr - st), puncteY.begin() + st);
  396.  
  397. //construim banda
  398. vector <punct> banda;
  399. for (int i = st; i < dr; ++i) {
  400. if (abs(puncteY[i].x - puncte[m].x) <= distMinStDr)
  401. banda.push_back(puncteY[i]);
  402. }
  403. //rezolvam banda
  404. double distMinOverall = distMinStDr;
  405. for (int i = 0; i<banda.size(); ++i)
  406. for (int j = i + 1; j < banda.size() && banda[j].y - banda[i].y <= distMinStDr; ++j) {
  407. double distCur = distEuclid(banda[i], banda[j]);
  408. if (distCur < distMinOverall)
  409. distMinOverall = distCur;
  410. }
  411.  
  412. return distMinOverall;
  413. }
  414.  
  415. void distMinPunctePlan() {
  416. int n;
  417. cin >> n;
  418.  
  419. vector <punct> puncte(n);
  420. for (int i = 0; i < n; ++i) {
  421. cin >> puncte[i].x;
  422. cin >> puncte[i].y;
  423. }
  424.  
  425. sort(puncte.begin(), puncte.end(), cmpDupaX);
  426.  
  427. vector <punct> puncteY = puncte;
  428.  
  429. cout << fixed;
  430. cout << setprecision(6) << distMinPunctePlanRec(puncte, 0, puncte.size(), puncteY) << "\n";
  431. }
  432.  
  433. int _tmain(int argc, _TCHAR* argv[])
  434. {
  435. jocGasireGaura();
  436. return 0;
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement