Advertisement
a53

varf

a53
Nov 16th, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.38 KB | None | 0 0
  1. /*
  2. Folosind o tehnica asemanatoare celei pentru
  3. generarea combinarilor, generam
  4. toate subsirurile x crescatoare
  5. de indici ai sirului a,
  6. de lungime mai mare sau egala ca 3,
  7. care satisfac conditiile problemei.
  8. */
  9. #include <fstream>
  10.  
  11. using namespace std;
  12. ifstream f("varf.in");
  13. ofstream g("varf.out");
  14. int n,a[12],x[12],p,b[2005][14],m;
  15.  
  16. void comb(int n,int k)
  17. {
  18. int i,ok1,ok2;
  19. if(k>p)
  20. { //avem deja o solutie de generare combinari de indici pe care o folosim
  21. i=1;
  22. ok1=0;
  23. while(i<p&&a[x[i]]<a[x[i+1]]) // verificam daca ne indreptam spre varf
  24. ++ok1,++i;
  25. ok2=0;
  26. while(i<p&&a[x[i]]>a[x[i+1]]) // verificam daca de la varf mai avem elemente spre dreapta
  27. ++ok2,++i;
  28. if(ok1&&ok2&&i==p) // Daca e varf il memoram
  29. {
  30. b[++m][0]=p; // Retinem lungimea solutiei
  31. for(i=1;i<=p;++i) // Retinem indicii pentru varf
  32. b[m][i]=x[i];
  33. }
  34. }
  35. else
  36. for(i=x[k-1]+1;i<=n;i++)
  37. {
  38. x[k]=i;
  39. comb(n,k+1); //mergem la pasul urmator, completam x[k+1]
  40. }
  41. }
  42.  
  43. int main()
  44. {
  45. f>>n;
  46. for(int i=1;i<=n;++i)
  47. f>>a[i];
  48. for(p=3;p<=n;++p)
  49. comb(n,1);
  50. if(m==0)
  51. g<<0;
  52. else
  53. { // Sortez lexicografic liniile matricii
  54. int ok,indice_maxim,k;
  55. for(int i=1;i<m;i++)
  56. {
  57. for(int j=i+1;j<=m;j++)
  58. {
  59. ok=0;
  60. indice_maxim=max(b[i][0],b[j][0]);
  61. for(k=1;k<=indice_maxim;++k) // Verificam daca liniile i si j sunt in ordine lexicografica
  62. {
  63. if(b[i][k]<b[j][k])
  64. {
  65. ok=1;
  66. break;
  67. }
  68. else
  69. if(b[i][k]>b[j][k])
  70. {
  71. ok=0;
  72. break;
  73. }
  74. }
  75. if(!ok) // Daca liniile nu sunt in ordine lexicografica, le inversam
  76. for(int k=0;k<=indice_maxim;++k)
  77. swap(b[i][k],b[j][k]);
  78. }
  79. }
  80. for(int i=1;i<=m;++i)
  81. {
  82. for(int j=1;j<=b[i][0];++j)
  83. g<<a[b[i][j]]<<' ';
  84. g<<'\n';
  85. }
  86. }
  87. return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement