turn.cpp


SUBMITTED BY: 111111

DATE: Nov. 1, 2017, 2:58 p.m.

FORMAT: Text only

SIZE: 2.0 kB

HITS: 317

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. ifstream fin("meh.in");
  4. ofstream fout("meh.out");
  5. struct cub
  6. {
  7. int l, cul;
  8. };
  9. cub v[20];
  10. int n, H, st[20],ap[20],sum[20];
  11. void afisare(int k)
  12. {
  13. for(int i=1;i<=k;i++)
  14. fout<<st[i]<<" ";
  15. fout<<"\n";
  16. }
  17. int valid (int k)
  18. {
  19. if(k>1 && v[st[k]].l>v[st[k-1]].l)
  20. return 0;
  21. if(v[st[k]].cul==v[st[k-1]].cul)
  22. return 0;
  23. if(sum[k-1]+v[st[k]].l<=H){
  24. sum[k] = sum[k-1] + v[st[k]].l;
  25. return 1;
  26. }
  27. return 0;
  28. }
  29. // Uitee!! Partea asta de aici trebuie inlocuita cu un vector de aparitii!
  30. //In loc sa umble prin stiva de fiecare data cand e apelat valid, e mai eficient sa verifici un vector. Ti-am modificat in functia back()!
  31. // for (int i=1; i<k; i++)
  32. // {
  33. // if(st[i]==st[k])
  34. // return 0;
  35. // }
  36. //aici trebuie sa verifici cu sume partiale! la fiecare pas faci un sum[k] = sum[k-1] + st[k] DACA sum[k-1] + st[k] e <=H
  37. // altfel, calculeaza de fiecare data cand intra in valid_sol() suma din stiva, ceea ce ia destul timp
  38. // Am pus sumele partiale in valid() pentru ca e mai ok si de citit si de controlat (sunt prea obosit sa-mi dau seama daca si mai eficient,
  39. // dar presupun ca da :))
  40. int valid_sol(int k)
  41. {
  42. if(sum[k]==H) return 1;
  43. return 0;
  44. }
  45. void back (int k)
  46. {
  47. for(int i=1; i<=n; i++)
  48. { // incercam doar daca indicele (i) nu a aparut inainte in stiva
  49. if(ap[i]==0){
  50. ap[i]=1; // notam ca a aparut in stiva
  51. st[k]=i;
  52. if(valid(k))
  53. if(valid_sol(k))
  54. afisare(k);
  55. else
  56. back(k+1);
  57. ap[i]=0; // cand se intoarce backu, indicele i dispare din stiva pentru ca nu mai e folosit, aparitia sa devine nula
  58. }
  59. }
  60. }
  61. int main()
  62. {
  63. fin>>n>>H;
  64. for(int i=1;i<=n;i++)
  65. fin>>v[i].l>>v[i].cul;
  66. back(1);
  67. return 0;
  68. }

comments powered by Disqus