给你?个任务,对于第?个任务,我们需要??的时间去完成它,它的 deadline 是??。如果我们设??为第?个任务的完成时刻,那你需要做的便是确定每个任务的 开始时间,使得max(max(0, ?? − ?? ))最小化。(同一时间只能做一个任务)
贪心地按照d从小到大排序任务,然后模拟即可。
证明:
因为随着任务的完成,时间是单调递增的,如果把d值小的任务放在后面的话,会得到一个更大的t-d,答案就不是最优的了。
附上代码
#include<cstdio> #include<algorithm> using namespace std; template<class T> inline void read(T &_a){ bool f=0;int _ch=getchar();_a=0; while(_ch<'0' || _ch>'9'){if(_ch=='-')f=1;_ch=getchar();} while(_ch>='0' && _ch<='9'){_a=(_a<<1)+(_a<<3)+_ch-'0';_ch=getchar();} if(f)_a=-_a; } int n,ans; struct mission //"Impossible Mission" { int t,d; bool operator < (const mission &x) const {return d<x.d;} }node[100001]; int main() { freopen("ming.in","r",stdin); freopen("ming.out","w",stdout); read(n); for (register int i=1;i<=n;++i) read(node[i].t),read(node[i].d); sort(node+1,node+n+1); int now=0; for (register int i=1;i<=n;++i) { now+=node[i].t; ans=max(ans,max(0,now-node[i].d)); } printf("%d",ans); return 0; }