[USACO08NOV]时间管理Time Management
题目
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工作要 做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的.
为了高效,列出了所有工作的清单.第i分工作需要T_i单位的时间来完成,而 且必须在S_i或之前完成.现在是0时刻.约翰做一份工作必须直到做完才能停 止.
所有的商人都喜欢睡懒觉.请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成.(如果无法完成全部任务,输出-1)
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
4 3 5 8 14 5 20 1 16
Sample Output
2
思路
一道水二分,先按完成时间s[i] 排序;
然后二分开始时间就可以了;‘
代码
#include<bits/stdc++.h> typedef long long ll; using namespace std; inline ll read() { ll a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } ll n; struct ljj { ll t,s; }a[1010]; inline ll cmp(ljj a,ljj b) { return a.s<b.s; } inline ll check(ll x) { for(ll i=1;i<=n;i++) { x+=a[i].t; if(x>a[i].s) return 0; } return 1; } int main() { n=read(); for(ll i=1;i<=n;i++) { a[i].t=read(); a[i].s=read(); } sort(a+1,a+n+1,cmp); ll l=0,r=a[n].s; ll ans=0; while(l<=r) { ll mid=(l+r)>>1; if(check(mid)) l=mid+1, ans=max(ans,mid); else r=mid-1; } if(ans) printf("%lld\n",ans); else puts("-1"); }
超水二分题,所以就不加什么解析了