Advertisement
Guest User

Untitled

a guest
Mar 1st, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1.  
  2. #include <iostream>
  3.  
  4. using namespace std;
  5.  
  6. struct resultTab // struktura stworzona do zwracania największej podtablicy
  7. {
  8.     int beg;
  9.     int end;
  10.     int sum;
  11. };
  12.  
  13. int mod(int n) { return n >= 0 ? n : (-n); } // zwraca wartosc bezwzgledna liczby
  14. int sum(int i, int j, int *tab); //sumuje elementy od od tab[i] do tab[j] według podanego wzoru
  15. resultTab maxTab(int *tab, int tabElem); // znajduje najwieksza podtablicę
  16.  
  17. int main()
  18. {
  19.     int *tab;
  20.     int sets;
  21.     int tabSize;
  22.     resultTab temp;
  23.  
  24.     while (!(cin >> sets && sets > 0)); // pomija bledne dane i zapetla sie az do wprowadzenia poprawnych
  25.  
  26.     for (int i = 0; i < sets; i++) // petla od liczby zestawow
  27.     {
  28.         while (!(cin >> tabSize && tabSize <= 10e6 && tabSize >= 1));// pomija bledne dane i zapetla sie az do wprowadzenia poprawnych
  29.         tab = new int[tabSize]; // tworzy tablice n-elementowa
  30.         for (int k = 0; k < tabSize; k++) // petla od liczb w poszczegolnych zestawach
  31.         {
  32.             while (!(cin >> tab[k] && mod(tab[k]) <= 2000)); // gdy wartosc przekracza 2000 to pomija i oczekuje na poprawne dane
  33.         }
  34.  
  35.         temp = maxTab(tab, tabSize);
  36.         cout << temp.beg << ", " << temp.end << ", " << temp.sum << endl;
  37.         delete[]tab;
  38.     }
  39.     system("PAUSE");
  40. }
  41.  
  42. int sum(int i, int j, int* tab)
  43. {
  44.     int result = 0;
  45.     if (i == j) // dla przypadku, gdy "sumujemy" jeden element
  46.     {
  47.         if (tab[i] < 0) return 0;
  48.         else result = tab[i];
  49.     }
  50.  
  51.     int negCounter = 0;
  52.     for (int a = i; a <= j; a++) // sprawdza czy wszystkie elementy nie są ujemne, gdy są zwraca 0
  53.     {
  54.         if (tab[a] < 0) negCounter++;
  55.     }
  56.     if (negCounter == j - i +1) return 0;
  57.  
  58.    
  59.     for (int k = i; k <= j; k++) // oblicza sumę według wzoru S=3*D+2*U
  60.     {
  61.  
  62.         if (tab[k] >= 0) result += 3 * tab[k];
  63.         else result += 2 * tab[k];
  64.     }
  65.     return result;
  66. }
  67.  
  68.  
  69. resultTab maxTab(int *tab, int tabElem)
  70. {
  71.     resultTab t {};
  72.     int tempSum;
  73.  
  74.     for (int i=0; i<tabElem; i++)
  75.         for (int j = i; j < tabElem; j++)
  76.             if ((tempSum = sum(i, j, tab) ) > t.sum)
  77.             {
  78.                 t.beg = i;
  79.                 t.end = j;
  80.                 t.sum = tempSum;
  81.             }
  82.     return t;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement