#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
const int MAX_N = 1e6 + 5; // Dimensiunea maximă a array-ului
int swimmerTimes[MAX_N]; // Timpii înotătorilor
int numSwimmers, minGroupSize, maxGroupSize; // Numărul de înotători și limitele grupurilor
// Verifică dacă putem împărți înotătorii cu o diferență maximă de `maxDiff`
bool canGroupWithMaxDiff(int maxDiff) {
deque<int> validWindow; // Deque pentru gestionarea ferestrei valide
int right = minGroupSize; // Indexul capătului din dreapta al grupului curent
validWindow.push_front(1); // Adăugăm primul înotător în fereastra validă
while (right <= numSwimmers && !validWindow.empty()) {
// Dacă dimensiunea grupului curent este suficient de mare
if (right - validWindow.front() + 1 >= minGroupSize) {
// Dacă grupul curent este valid și respectă constrângerile
if (right - validWindow.front() + 1 <= maxGroupSize &&
swimmerTimes[right] - swimmerTimes[validWindow.front()] <= maxDiff) {
// Extindem grupul spre dreapta
right++;
validWindow.push_back(right);
} else {
// Dacă grupul nu este valid, eliminăm din partea stângă
validWindow.pop_front();
}
} else {
// Dacă grupul este prea mic, extindem grupul spre dreapta
right++;
}
}
// Verificăm dacă am reușit să grupăm toți înotătorii valid
if (validWindow.empty() || validWindow.back() != numSwimmers + 1) {
return false;
}
return true;
}
int main() {
cin >> numSwimmers >> minGroupSize >> maxGroupSize;
// Citim timpii înotătorilor
for (int i = 1; i <= numSwimmers; i++) {
cin >> swimmerTimes[i];
}
// Sortăm timpii
sort(swimmerTimes + 1, swimmerTimes + numSwimmers + 1);
// Binary search pe diferența maximă permisă
int left = 0, right = swimmerTimes[numSwimmers] - swimmerTimes[1], result = 0;
while (left <= right) {
int mid = (left + right) / 2; // Diferența maximă curentă
if (canGroupWithMaxDiff(mid)) {
result = mid; // Salvează soluția validă
right = mid - 1; // Încearcă o diferență mai mică
} else {
left = mid + 1; // Încearcă o diferență mai mare
}
}
// Afișăm rezultatul final
cout << result << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |