#include <bits/stdc++.h>
using namespace std;
struct job {
int time;
int idx;
bool operator < (const job &other) const {
return time < other.time;
}
};
const int MAX_M = 1e6 + 10;
job a[MAX_M];
vector<vector<int>> ans(100010);
int n, m, d;
bool check(int k) {
int cur_day = 1;
for (int i = 1; i <= m; i += k) {
if (cur_day > n) return false;
if (a[i].time < cur_day) return false;
cur_day++;
}
return true;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> d >> m;
for (int i = 1; i <= m; i++) {
cin >> a[i].time;
a[i].time += d; // Adjust deadline
a[i].idx = i; // Original index
}
sort(a + 1, a + m + 1); // Sort by deadline (time)
// Binary search to find minimum number of machines per day
int l = 1, r = m;
int best_k = m;
while (l <= r) {
int mid = (l + r) / 2;
if (check(mid)) {
best_k = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
cout << best_k << '\n';
// Assign jobs into groups of size `best_k`
for (int i = 1; i <= m; i++) {
int day = ((i - 1) / best_k) + 1;
ans[day].push_back(a[i].idx);
}
// Output exactly `n` lines, each ending with 0
for (int i = 1; i <= n; i++) {
for (int j = 0; j < ans[i].size(); j++) {
cout << ans[i][j] << " ";
}
cout << "0\n";
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |