| 69 | |
| 70 | return maxPossibleMinScore; |
| 71 | } |
| 72 | |
| 73 | private boolean canAchieve(int[] points, int n, int m, long targetScore) { |
| 74 | long movesUsed = 0, extraMoves = 0, skippedMoves = 0; |
| 75 | |
| 76 | for (int i = 0; i < n && movesUsed <= m; i++) { |
| 77 | int currentPoints = points[i]; |
| 78 | long requiredMoves = (targetScore + currentPoints - 1) / currentPoints; |
| 79 | |
| 80 | if (extraMoves >= requiredMoves) { |
| 81 | extraMoves = 0; |
| 82 | skippedMoves++; |
| 83 | } else { |
| 84 | long transferredPoints = extraMoves * (long) currentPoints; |
| 85 | long newMoves = ((targetScore - transferredPoints) + currentPoints - 1) / currentPoints; |
| 86 | movesUsed += 2 * newMoves - 1; |
| 87 | movesUsed += skippedMoves; |
| 88 | |
| 89 | extraMoves = Math.max(newMoves - 1, 0); |
| 90 | skippedMoves = 0; |
| 91 | } |
| 92 | } |
| 93 | |
| 94 | return movesUsed <= m; |
| 95 | } |
| 96 | } |