[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
",ans);
    else
        puts("-1");
}

超水二分题,所以就不加什么解析了

原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/13410332.html