本文共 1681 字,大约阅读时间需要 5 分钟。
为了解决这个问题,我们需要处理接下来的n天的借教室信息,其中每天可供租借的教室数量不同。我们需要处理m份订单,每份订单要求从某一天到另一天每天租借一定数量的教室。我们的任务是判断是否所有订单都能满足,如果不能,找出第一个无法满足的订单的申请人编号。
我们采用二分答案的方法来快速确定是否存在一个订单无法满足条件。具体步骤如下:
#include#include #include using namespace std;int main() { int n, m; cin >> n >> m; vector r(n + 1); for (int i = 1; i <= n; ++i) { cin >> r[i]; } vector d(m + 1), s(m + 1), t(m + 1); for (int i = 1; i <= m; ++i) { int dj, sj, tj; cin >> dj >> sj >> tj; d[i] = dj; s[i] = sj; t[i] = tj; } vector diff(n + 2, 0); int left = 1; int right = m; int result = 0; while (left < right) { int mid = left + (right - left + 1) / 2; // 处理前mid个订单 for (int i = 1; i <= mid; ++i) { int s_i = s[i]; int t_i = t[i]; diff[s_i] += d[i]; if (t_i + 1 <= n) { diff[t_i + 1] -= d[i]; } } // 计算前缀和并检查 int current = 0; bool ok = true; for (int i = 1; i <= n; ++i) { current += diff[i]; if (current > r[i]) { ok = false; break; } } if (ok) { left = mid; } else { right = mid - 1; } } if (left == m) { cout << "0" << endl; } else { cout << "-1" << endl; cout << left + 1 << endl; }}
这种方法通过二分查找和差分数组高效地处理了大规模的数据,确保了算法的时间复杂度为O(n log m),在处理大数据时非常高效。
转载地址:http://vojfk.baihongyu.com/