Alex_tz307

Fundamente XI - Etape - 213

Sep 21st, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define pi pair < int , int >
  3. #define x first
  4. #define y second
  5.  
  6. using namespace std;
  7.  
  8. inline void Trace(int i, int j, vector < pi >& a, vector < vector < int > >& t) {
  9.     if(t[i][j] != 0) {
  10.         Trace(i - a[t[i][j]].x, j - a[t[i][j]].y, a, t);
  11.         cout << a[t[i][j]].x << ' ' << a[t[i][j]].y << '\n';
  12.     }
  13. }
  14.  
  15. int main() {
  16.     ios_base::sync_with_stdio(false);
  17.     cin.tie(nullptr);
  18.     cout.tie(nullptr);
  19.     int N, p, q;
  20.     cin >> N >> p >> q;
  21.     vector < pi > a(N + 1);
  22.     for(int i = 1; i <= N; ++i)
  23.         cin >> a[i].x >> a[i].y;
  24.     vector < vector < int > > dp(128, vector < int >(128));
  25.     /* dp[i][j] = x <=> exista o submultime de x meciuri in care gazdele au dat i goluri
  26.        si oaspetii j */
  27.     dp[a[1].x][a[1].y] = 1;
  28.     vector < vector < int > > t(128, vector < int >(128));
  29.     // t[i][j] = index-ul ultimului meci folosit pentru a obtine scorul (i, j)
  30.     t[a[1].x][a[1].y] = 1;
  31.     int x = a[1].x, y = a[1].y;
  32.     for(int i = 2; i <= N; ++i) {
  33.         for(int j = x; j >= 0; --j)
  34.             for(int k = y; k >= 0; --k)
  35.                 if(dp[j][k] != 0 && dp[j + a[i].x][k + a[i].y] == 0) {
  36.                     dp[j + a[i].x][k + a[i].y] = dp[j][k] + 1;
  37.                     t[j + a[i].x][k + a[i].y] = i;
  38.                 }
  39.         if(dp[a[i].x][a[i].y] == 0) {
  40.             dp[a[i].x][a[i].y] = 1;
  41.             t[a[i].x][a[i].y] = i;
  42.         }
  43.         x += a[i].x;
  44.         y += a[i].y;
  45.     }
  46.     Trace(p, q, a, t);
  47. }
  48.  
Advertisement
Add Comment
Please, Sign In to add comment