[USACO08NOV]時間管理Time Management(排序,貪心)

題目描述

做爲一名忙碌的商人,約翰知道必須高效地安排他的時間.他有N工做要 作,好比給奶牛擠奶,清洗牛棚,修理柵欄之類的.ios

爲了高效,列出了全部工做的清單.第i分工做須要T_i單位的時間來完成,而 且必須在S_i或以前完成.如今是0時刻.約翰作一份工做必須直到作完才能停 止.優化

全部的商人都喜歡睡懶覺.請幫約翰計算他最遲何時開始工做,可讓全部工做按時完成.(若是沒法完成所有任務,輸出-1)spa

輸入輸出格式

輸入格式:指針

* Line 1: A single integer: Ncode

* Lines 2..N+1: Line i+1 contains two space-separated integers: T_i and S_iblog

輸出格式:排序

* Line 1: The latest time Farmer John can start working or -1 if Farmer John cannot finish all the jobs on time.it

說明

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.io

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.ast

思路:

一道大水題,然而我仍是錯了……

咱們知道他的持續時間和結束時間,那麼咱們確定要在結束以前完成全部(不然輸出-1)

因此咱們按照結束時間排序

由於題目讓你求最晚何時開始,因此咱們儘量地將任務日後放

對應過來就是從最大的開始,時光倒流

用一個time指針維護上一個開始的時刻

若是time比當前一個的結束點早,那麼當前一個的實際結束點就是time

反之實際結束點就是最晚結束點

o(n)掃一遍便可

加上排序時間複雜度總共是O(nlogn+n)

很優化

代碼:

#include<iostream> #include<cstdio> #include<algorithm>
#define rii register int i
using namespace std; struct deal{ int keep,start,last; }x[100005]; int n,time; bool cmp(deal ltt,deal kkk) { return ltt.last>kkk.last; } int main() { // freopen("manage.in","r",stdin); // freopen("manage.out","w",stdout);
    scanf("%d",&n); for(rii=1;i<=n;i++) { scanf("%d%d",&x[i].keep,&x[i].last); x[i].start=x[i].last-x[i].keep; } sort(x+1,x+n+1,cmp); time=x[1].start; for(rii=2;i<=n;i++) { if(x[i].last<time) { time=x[i].start; } else { time=time-x[i].keep; } } if(time<0) { printf("-1"); return 0; } printf("%d",time); return 0; }
相關文章
相關標籤/搜索