Advertisement
Nita_Cristian

taxe2

Feb 25th, 2020
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("taxe2.in");
  6. ofstream fout("taxe2.out");
  7.  
  8. int S, n, a[105][105], s[105][105];
  9. int di[4] = {-1, 0, 1, 0}, dj[4] = {0, 1, 0, -1};
  10. bitset<105> v[105];
  11.  
  12. struct taxa
  13. {
  14.     int suma, i, j;
  15. };
  16.  
  17. struct comparator
  18. {
  19.     bool operator()(const taxa &t1, const taxa &t2)
  20.     {
  21.         return t1.suma < t2.suma;
  22.         //return s[t1.i][t1.j] < s[t2.i][t2.j];
  23.     }
  24. };
  25.  
  26. bool corect(int i, int j)
  27. {
  28.     return i >= 1 && j >= 1 && i <= n && j <= n;
  29. }
  30.  
  31. void lee(int i, int j)
  32. {
  33.     s[i][j] = a[i][j]; /// suma din punctul de plecare este evident suma de din punctul din care pornim
  34.  
  35.     priority_queue<taxa, vector<taxa>, comparator> q; /// creez o coada cu prioritati pentru a memora cea mai buna suma cat si indici aceste sume
  36.     q.push({-s[i][j], i, j});                         /// in coada pun suma cu - pentru a avea mereu cea mai mica suma in .top()
  37.     v[i][j] = 1;                                      /// am suma in coada deci o marchez
  38.  
  39.     while (!q.empty())
  40.     {
  41.         int suma = -q.top().suma;
  42.         i = q.top().i;
  43.         j = q.top().j;
  44.         q.pop();
  45.  
  46.         v[i][j] = 0; /// debifez suma pentru a o putea inlocui daca este cazul alta data
  47.  
  48.         for (int k = 0; k < 4; k++) /// iau fiecare vecin al sumei curente
  49.         {
  50.             int ni = i + di[k];
  51.             int nj = j + dj[k];
  52.             if (corect(ni, nj) && a[ni][nj] + suma < s[ni][nj]) /// daca o pot imbunatatii
  53.             /// adica daca suma curenta + elementul urmator este mai < decat suma urmatoare
  54.             {
  55.                 s[ni][nj] = suma + a[ni][nj]; /// actualizez suma
  56.                 if (!v[ni][nj])               /// daca punctul nu a fost adaugat in coada il pun
  57.                     q.push({-s[ni][nj], ni, nj}), v[ni][nj] = 1;
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63. int main()
  64. {
  65.     fin >> S >> n; /// citest suma maxima si matricea
  66.     for (int i = 1; i <= n; i++)
  67.         for (int j = 1; j <= n; j++)
  68.             fin >> a[i][j];
  69.  
  70.     memset(s, 1, sizeof(s)); /// setez toate elemntele matricei de sume cu infinit
  71.     /// pentru a putea retine mai tarziu sumele minime
  72.     /// daca toate elementele ar fi 0 si suma minima ar fi 0!!
  73.  
  74.     lee(1, 1); /// pornesc din coltul din stanga sus
  75.  
  76.     if (s[n][n] <= S) /// daca suma de bani cu care am ajuns in dreapta jos imi ajunge
  77.         fout << S - s[n][n];
  78.     else
  79.         fout << -1;
  80.  
  81.     fin.close();
  82.     fout.close();
  83.  
  84.     return 0;
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement