Submission #553998

#TimeUsernameProblemLanguageResultExecution timeMemory
553998d4xnTravelling Merchant (APIO17_merchant)C++17
0 / 100
1082 ms1364 KiB
#pragma GCC optimize ("Ofast")
//#pragma GCC target ("avx2")
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define ld long double
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define ii pair<int, int>
#define ff first
#define ss second
#define mp make_pair
#define UB upper_bound
#define LB lower_bound
#define pb push_back
#define vi vector<int>
#define vvi vector<vi>
#define vb vector<bool>
#define vvb vector<vb>
#define vs vector<string>
#define vii vector<ii>
#define vvii vector<vii>
#define vll vector<ll>
#define vld vector<ld>

const int N = 101, K = 1001;

int n, m, k, ans;
vii adj[N];
bool vis[N][N];
int p[N];
int buy[N][K];
int sell[N][K];
vi cycle;

int best(int idx, int x, int sum) { // en que idx estoy, que objeto llevo, cuanto dinero llevo
  if (idx == cycle.size()) return sum;

  int u = cycle[idx];
  int mx = 0;

  // en este nodo no hago nada
  mx = max(mx, best(idx+1, x, sum));

  if (x != -1) {
    // lo puedo vender?
    int s = sell[u][x];
    if (s != -1) mx = max(mx, best(idx, -1, sum + s));
  }

  for (int i = 0; i < k; i++) {
    // lo puedo comprar?
    int b = buy[u][i];
    if (b != -1) mx = max(mx, best(idx+1, i, sum - b));
  }

  return mx;
}
void dfs(int u, int par, int d, int s) {
  vis[par][u] = 1;
  p[u] = par;

  for (auto &[v, w] : adj[u]) {
    if (vis[u][v]) continue;
    
    if (v == s) {
      cycle.clear();
      cycle.pb(s);
      while (u != s) {
        cycle.pb(u);
        u = p[u];
      }
      cycle.pb(s);
      reverse(all(cycle));

      ans = max(ans, best(0, -1, 0) / (d+w));
    }
    else dfs(v, u, d+w, s);
  }

  vis[par][u] = 1;
}

signed main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  ans = 0;
  cin >> n >> m >> k;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < k; j++) {
      int b, s;
      cin >> b >> s;
      buy[i][j] = b;
      sell[i][j] = s;
      assert(buy[i][j] >= sell[i][j]);
    }
  }

  while (m--) {
    int x, y, z;
    cin >> x >> y >> z;
    x--; y--;
    adj[x].pb(mp(y, z));
  }

  for (int i = 0; i < n; i++) {
    dfs(i, i, 0, i);
  }

  cout << ans << "\n";

  return 0;
}

Compilation message (stderr)

merchant.cpp: In function 'long long int best(long long int, long long int, long long int)':
merchant.cpp:39:11: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |   if (idx == cycle.size()) return sum;
      |       ~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...