• [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");
    }

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

  • 相关阅读:
    取字符串前缀
    分解质因数
    git 常用命令
    微信 iphone端 audio 播放问题
    git入门:创建合并分支 解决冲突 分支管理策略
    git入门:远程仓库 github篇
    git入门:撤销修改 删除文件
    git入门: 工作区暂存区 以及 管理修改
    函数柯里化实现
    转载:深度工作:充分使用每一份脑力
  • 原文地址:https://www.cnblogs.com/wzx-RS-STHN/p/13410332.html
Copyright © 2020-2023  润新知