Submission
Status:
[PP-SSSSSSSSSSSS]
Subtask/Task Score:
{0/100}
Score: 0
User: goine
Problemset: forex
Language: cpp
Time: 0.002 second
Submitted On: 2025-10-10 21:52:25
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<vector<double>> rate(n, vector<double>(n));
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> rate[i][j]; // get input
int bestStart = -1;
int bestSteps = n + 1;
vector<int> bestPath;
for (int start = 0; start < n; start++) {
vector<vector<double>> dp(n, vector<double>(n+1, 0.0));
vector<vector<int>> pre(n, vector<int>(n+1, -1));
dp[start][0] = 1.0;
int stepsFound = -1;
int endCurrency = -1;
for (int k = 1; k <= n; k++) {
for (int u = 0; u < n; u++) {
if (dp[u][k-1] == 0) continue;
for (int v = 0; v < n; v++) {
double val = dp[u][k-1] * rate[u][v];
if (val > dp[v][k]) {
dp[v][k] = val;
pre[v][k] = u;
}
}
}
if (dp[start][k] > 1.01) {
stepsFound = k;
endCurrency = start;
break;
}
}
if (stepsFound != -1 && stepsFound < bestSteps) {
bestSteps = stepsFound;
bestStart = start;
vector<int> path(stepsFound+1);
int cur = endCurrency;
for (int k = stepsFound; k >= 1; k--) {
path[k] = cur + 1; // convert to base 1
cur = pre[cur][k];
}
path[0] = start + 1;
bestPath = path;
}
}
if (bestStart == -1) {
cout << -1 << endl;
} else {
for (int i = 0; i < bestSteps; i++) {
cout << bestPath[i];
if (i < bestSteps) cout << " ";
}
cout << endl;
}
return 0;
}