BZOJ 1620 [Usaco2008 Nov]Time Management 時間管理:貪心

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

題意:ios

  有n個工做,每個工做完成須要花費的時間爲tim[i],完成這項工做的截止日期爲dead[i]。spa

  問你在保證全部工做按時完成的前提下,最晚何時開始工做。code

  (天天從時刻0開始算。若是不管如何都完成不了,輸出-1)blog

 

題解:排序

  貪心。ci

  先將全部工做按dead從大到小排序。get

  當前開始工做的時間爲start(初始爲INF)。string

  對於每一個工做,start必定要知足兩個條件:it

    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 }
相關文章
相關標籤/搜索