题目大意:给定n个任务的截止时间和完成任务所需的时间,现在问最多可以完成多少件任务。
此题看上去跟区间问题差不多,但是时间上无法确定区间是什么。但是思想都是一样的,就是尽量在较短的时间内完成同样多的任务。
先按截止时间排序,然后对于一个任务,看已选择的任务中存不存在,这样的情况使得 完成任务时间大于当前的任务,如果存在,则删去已选择的,压入当前的。可用反证法证明。
另外遇到了一个让人无法理解的问题,详见代码
//
// main.cpp
// uva 1153 - Keep the Customer Satisfied
//
// Created by XD on 15/8/17.
// Copyright (c) 2015年 XD. All rights reserved.
//
#include <iostream>
#include <string>
#include <queue>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<vector>
#include <string.h>
#include <string>
#include <algorithm>
#include <set>
#include <map>
#include <cstdio>
using namespace std ;
const int maxn =800010;
struct node
{
int t ,d ;
bool operator < (const node &n ) const{
return t <n.t ;
} ;
};
bool cmp(node& a ,node& b)
{
return a.d < b.d ? true:false ;
}
node order[maxn] ;
priority_queue<int> que ;
int main(int argc, const char * argv[]) {
int T ,n; scanf("%d" ,&T) ;
while (T--) {
scanf("%d" ,&n) ;
for (int i = 0; i < n ; i++) {
scanf("%d%d" , &order[i].t,&order[i].d) ;
}
sort(order, order+n,cmp) ;
while (!que.empty()) {
que.pop() ;
}
int ctime = 0; int ans =0 ;
for (int i = 0; i < n;i++) {
int time = order[i].t ;
//先将ctime + time 是通过不了的。但是拆开就过得了了。郁闷没理解为什么。
// ctime += time ;
if (ctime + time > order[i].d) {
if (!que.empty()) {
int t = que.top() ;
if (t < time) {
;
// ctime-= time ;
}
else{
que.pop();
que.push(time) ;
ctime = ctime - t + time ;
}
}
continue ;
}
que.push(time) ;
ctime += time ;
ans++;
}
printf("%d\n",ans) ;
if(T) printf("\n") ;
}
return 0;
}