1 条题解
-
0
理解题意
给定 个区间 ,找一个最长的连续时间段 ,使得至少有 个区间完全包含它。输出最大长度,无解输出 。
思路
将学生按左端点 升序排序。
遍历时,前 个学生的 ,若从中选出 个右端点最大的,它们的最小右端点就是当前能选的最大 。
用最小堆维护这 个右端点,堆顶即为 ,当前候选长度为 (需满足 )。
代码
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, k; cin >> n >> k; vector<pair<int, int>> a(n); for (auto &p : a) cin >> p.first >> p.second; sort(a.begin(), a.end()); priority_queue<int, vector<int>, greater<int>> pq; long long ans = 0; for (int i = 0; i < n; ++i) { pq.push(a[i].second); if ((int)pq.size() > k) pq.pop(); if ((int)pq.size() == k && pq.top() > a[i].first) ans = max(ans, (long long)pq.top() - a[i].first); } cout << ans << '\n'; return 0; }- 使用AI完善了公式化表达并优化了语言表达
- 1
信息
- ID
- 12620
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者