阿浜的冰可乐
题目来源
http://www.zylpb.cn/problem/1012
描述
阿浜喜欢喝肥宅快乐水,并且只喝冰可乐,他认为常温可乐是没有灵魂的。
他有 n 瓶冰可乐,第 i 瓶冰可乐喝完需要 ti1 分钟,而保持冰度的最后时间为 ti2 分钟,因此他想要喝完第 i 瓶可乐就必须在 ti2 分钟之前喝完。
阿浜喝可乐只会喝完一瓶可乐才会喝下瓶可乐,不能够同时喝多瓶可乐,他现在想知道能够喝完的最大冰可乐的瓶数。
输入
第一行一个整数n (1<=n<=200000)
随后n行,每行两个整数ti1,ti2 (1<=ti1<ti2<=200000000)
输出
输出一个整数表示阿浜能够喝完的冰可乐的最大瓶数
输入样例 1
4
2 3
3 5
4 5
5 6
输出样例 1
2
题目思路
运用贪心思想,想要获得最短时间,就得将所经历的时间全部运用到位。
先按照ti2的时间排序,方便后面进行安排。(一个一个的添加到坐标轴中)
然后设置储存一个所用时间的变量y以及优先队列。
如果y + ti1 <= ti2 说明能够放进优先队列,continue。
如果不能放进去并且我们这个元素的时间比优先队列队首的时间少,那我们就将其替换一下,换成小的,使得在此时间之前所放进去的结果是最优的,在前y个时间中喝的瓶数达到最多。(优先队列默认大根堆,所以只要去队首即可。)
最后输出优先队列的大小。
题解
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
priority_queue<PII> q;
vector<PII> alls;
int main() {
int t;
scanf("%d", &t);
while (t--) {
int a, b;
scanf("%d%d", &a, &b);
alls.push_back({ a, b });
}
sort(alls.begin(), alls.end(), [](PII a, PII b) {
if (a.second != b.second) return a.second < b.second;
return a.first < b.first;
});
int y = 0;
for (auto i : alls) {
if (y + i.first <= i.second) {
y += i.first;
q.push(i);
continue;
}
PII u = q.top();
if (u.first > i.first) {
q.pop();
y -= u.first;
y += i.first;
q.push(i);
}
}
printf("%d\n", q.size());
return 0;
}