題目連接: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 }