1620: [Usaco2008 Nov]Time Management 時間管理
Time Limit:?5 Sec??Memory Limit:?64 MBSubmit:?850??Solved:?539
[Submit][Status][Discuss]
Description
Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs conveniently numbered 1..N (1 <= N <= 1,000) to accomplish (like milking the cows, cleaning the barn, mending the fences, and so on). To manage his time effectively, he has created a list of the jobs that must be finished. Job i requires a certain amount of time T_i (1 <= T_i <= 1,000) to complete and furthermore must be finished by time S_i (1 <= S_i <= 1,000,000). Farmer John starts his day at time t=0 and can only work on one job at a time until it is finished. Even a maturing businessman likes to sleep late; help Farmer John determine the latest he can start working and still finish all the jobs on time.
N個工作,每個工作其所需時間,及完成的Deadline,問要完成所有工作,最遲要什么時候開始.
Input
* Line 1: A single integer: N
* Lines 2..N+1: Line i+1 contains two space-separated integers: T_i and S_i
Output
* Line 1: The latest time Farmer John can start working or -1 if Farmer John cannot finish all the jobs on time.
Sample Input
3 5
8 14
5 20
1 16
INPUT DETAILS:
Farmer John has 4 jobs to do, which take 3, 8, 5, and 1 units of
time, respectively, and must be completed by time 5, 14, 20, and
16, respectively.
Sample Output
OUTPUT DETAILS:
Farmer John must start the first job at time 2. Then he can do
the second, fourth, and third jobs in that order to finish on time.
HINT
Source
Silver
?
Analysis
?一波排序,把死線從后往前排
只有最后一條死線可以壓著線做
然而由于農夫超~~~~專注的,同一時間只能做一件事
因此從后往前遍歷,往時間軸上安排事情
防止前面的事情影響后面壓線完成任務
=w=
細節自行思考
?
Code


1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #define maxn 10000000 5 using namespace std; 6 7 struct job{ 8 int t,deadline; 9 }list[maxn/1000]; 10 11 int n; 12 13 int cnt[maxn]; 14 15 bool cmp(const job &a,const job &b){ 16 return a.deadline < b.deadline; 17 } 18 19 int main(){ 20 scanf("%d",&n); 21 22 for(int i = 1;i <= n;i++) 23 scanf("%d%d",&list[i].t,&list[i].deadline); 24 25 sort(list+1,list+1+n,cmp); 26 27 for(int i = n;i >= 1;i--){ 28 int j = list[i].deadline; 29 while(cnt[j] && j) j--; 30 list[i].deadline = j; 31 int tmp = list[i].t; 32 while(tmp && j) cnt[j--] = 1,tmp--; 33 } 34 35 int ans = list[1].deadline-list[1].t; 36 if(ans < 0) printf("-1"); 37 else printf("%d",ans); 38 // cout << ans; 39 40 // for(int i = 1;i <= n;i++){ 41 // printf("%d %d\n",list[i].t,list[i].deadline); 42 // } 43 44 45 46 return 0; 47 }