Finding Minimum and Maximum Value
Don't do using namespace std;.
Use an appropriate type for the range. The number of test-cases can never be negative, so we should use an unsigned integer. It looks like the player capabilities are similarly unsigned.
for (int i = 1; i &lt;= testCases; i++) In C++, it's more usual to use != for the end condition, and use the pre-increment operator (since we don't a temporary value). It's usually safer to use a zero-based index, and simply add one for printing if we need to convert to one-based: for (int i = 0; i != testCases; ++i).
int attack {}, defense {}, physical {};. Declare variables (especially POD variables) as close to the point of use as possible to minimize their scope and avoid reusing them for multiple things. These should be declared in each of the innermost loops.
reserve is not a constant value, so this is not valid C++: int reservePlayers [reserve];, even if some compilers allow it. We should use a std::vector instead. (This particular array also appears to be unused!)
for (int i = 0; i &lt; totalOriginalPlayer; i++) The loop condition variable shadows the i variable of the outer loop. This is likely to cause confusion. It would be better to pick a meaningful name for the loop variables, e.g. outfielderIndex.
It might be neater to separate the logic of the program from reading the input. Then we could reuse the input reading code for both sets of players.

std::vector&lt;std::uint32_t&gt; outfielders = ReadPlayerData(numOutfielders);
std::vector&lt;std::uint32_t&gt; reserves = ReadPlayerData(numReserves);
std::uint32_t total = // ...
std::uint32_t worstOutfielder = // ...
std::uint32_t bestReserve = // ...

// ... do output

We can use the standard library to do the necessary math. Specifically std::accumulate, std::min_element and std::max_element.