BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=1620
N个工作,每个工作其所需时间,及完成的Deadline,问要完成所有工作,最迟要什么时候开始.
分析
我们可以想到二分开始的时间.对于一个给定的时间,判断是否可以完成.
如何判断呢?
我们假设有\(a,b\)两个任务且\(deadline(a)<deadline(b)\).
如果先完成\(b\),那么要求\(time[b]+time[a]<deadline(a)\).
如果先完成\(a\),那么要求\(time[a]<deadline(a),time[a]+time[b]<deadline(b)\).
显然第二种方案完成的可能性更大,所以我们贪心的选择每次先完成\(deadline\)小的任务.
1 #include <bits/stdc++.h> 2 #define fst first 3 #define scd second 4 using namespace std; 5 6 typedef pair <int,int> P; 7 const int maxn=1000+5; 8 int n,Max=~0u>>1; 9 P a[maxn]; 10 inline int read(int &x){x=0;int k=1;char c;for(c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')k=-1;for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';return x*=k;} 11 inline bool cmp(P a,P b){ return a.scd<b.scd; } 12 inline bool C(int x){ 13 for(int i=1,t=x-1;i<=n;i++){ 14 t+=a[i].fst; 15 if(t>=a[i].scd) return false; 16 } 17 return true; 18 } 19 inline int bsearch(int l,int r){ 20 while(l<r){ 21 int mid=l+(r-l+1)/2; 22 if(C(mid)) l=mid; 23 else r=mid-1; 24 } 25 return l; 26 } 27 inline void init(){ 28 read(n); 29 for(int i=1;i<=n;i++) read(a[i].fst), read(a[i].scd), Max=min(Max,a[i].scd-a[i].fst); 30 sort(a+1,a+n+1,cmp); 31 } 32 int main(){ 33 init(); 34 int ans=bsearch(0,Max); 35 if(ans==0) ans=-1; 36 printf("%d\n",ans); 37 return 0; 38 }