BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)

Posted 晴歌。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
View Code

 

以上是关于BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ1620][Usaco2008 Nov]Time Management 时间管理

[BZOJ] 1620: [Usaco2008 Nov]Time Management 时间管理

BZOJ_1619_[Usaco2008_Nov]_Guarding_the_Farm_保卫牧场_(模拟+bfs)

BZOJ1620[Usaco2008 Nov]Time Management 时间管理

BZOJ——1620: [Usaco2008 Nov]Time Management 时间管理

BZOJ 1620 [Usaco2008 Nov]Time Management 时间管理:贪心