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

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1620

题意:

  有n个工作,每一个工作完成需要花费的时间为tim[i],完成这项工作的截止日期为dead[i]。

  问你在保证所有工作按时完成的前提下,最晚什么时候开始工作。

  (每天从时刻0开始算。如果无论如何都完成不了,输出-1)

 

题解:

  贪心。

  先将所有工作按dead从大到小排序。

  当前开始工作的时间为start(初始为INF)。

  对于每个工作,start一定要满足两个条件:

    start <= dead - tim (最后一刻才完成这项工作的开始时间)

    start + tim <= 原来的start (这项工作做完了之后,才能开始别的工作)

  所以start = min(start - tim, dead - tim)

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 #define MAX_N 1005
 6 #define INF 10000000
 7 
 8 using namespace std;
 9 
10 struct Work
11 {
12     int tim;
13     int dead;
14     Work(int _tim,int _dead)
15     {
16         tim=_tim;
17         dead=_dead;
18     }
19     Work(){}
20     friend bool operator < (const Work &a,const Work &b)
21     {
22         return a.dead>b.dead;
23     }
24     void read_work()
25     {
26         cin>>tim>>dead;
27     }
28 };
29 
30 int n;
31 int start=INF;
32 Work work[MAX_N];
33 
34 void read()
35 {
36     cin>>n;
37     for(int i=0;i<n;i++)
38     {
39         work[i].read_work();
40     }
41 }
42 
43 void solve()
44 {
45     sort(work,work+n);
46     for(int i=0;i<n;i++)
47     {
48         Work now=work[i];
49         start=min(start-now.tim,now.dead-now.tim);
50     }
51 }
52 
53 void print()
54 {
55     if(start>=0) cout<<start<<endl;
56     else cout<<-1<<endl;
57 }
58 
59 int main()
60 {
61     read();
62     solve();
63     print();
64 }

 

posted @ 2017-09-29 20:21  Leohh  阅读(125)  评论(0编辑  收藏  举报