题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1029
题解:
显然的贪心题。
我们可以先按结束的时间从小到大进行排序,然后每次贪心的去取。
设当前可以得到的最短时间为 nowtime 。
如果当前一栋建筑的nowtime+抢修时间比报废时间早(<=),那么答案+1。
否则看当前时间是否最优,不是则更新即可。
还有,注意要开long long。
代码:
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int size = 150005;
struct _repair{
LL t1, t2;
bool operator< (_repair a) const {
return t2 < a.t2;
}
} re[size];
int n;
priority_queue<int> que;
int main() {
scanf("%d", &n);
for ( int i = 1; i <= n; i ++ ) scanf("%lld %lld", &re[i].t1, &re[i].t2);
sort(re+1, re+n+1);
int nowtime = 0, ans = 0;
for ( int i = 1; i <= n; i ++ ) {
if ( nowtime+re[i].t1 <= re[i].t2 ) {
que.push(re[i].t1);
nowtime += re[i].t1;
ans ++;
} else if( re[i].t1 < que.top() && (nowtime+re[i].t1-que.top()) <= re[i].t2 ) {
nowtime = nowtime+re[i].t1-que.top();
que.pop(); que.push(re[i].t1);
}
}
printf("%d\n", ans);
return 0;
}