题解 P2920 【[USACO08NOV]时间管理Time Management】

题面

作为一名忙碌的商人,约翰知道必须高效地安排他的时间.他有N工作要 做,比如给奶牛挤奶,清洗牛棚,修理栅栏之类的.

为了高效,列出了所有工作的清单.第i分工作需要T_i单位的时间来完成,而 且必须在S_i或之前完成.现在是0时刻.约翰做一份工作必须直到做完才能停 止.

所有的商人都喜欢睡懒觉.请帮约翰计算他最迟什么时候开始工作,可以让所有工作按时完成.(如果无法完成全部任务,输出-1)

题意

有一个人有N项工作,给N组数据,每组数据有Ti和Si,分别表示第i组工作需要花费的时间和最晚完成的时间。

初始时间为0,要求算出最晚可以什么时间开始工作。

题解

50分操作 (有BUG 不严谨证明)

由题意可以知道这道题可以尝试以下模拟操作。

  1. 排序每一项最晚完成的时间。
  2. 枚举,如果前i项任务完成时间超过第i项任务花费的时间,就非法,输出-1。
  3. 统计出每一项任务 最晚完成时间 - 花费时间的值。
  4. 排序输出最小的统计值。 (不完全归纳法得出3、4操作,不严谨证明)
#include<bits/stdc++.h>
using namespace std;

int n = 0,tong[1010];

struct edge{
    int t,s;
    bool operator < (const edge &qxq)
    {
        return s < qxq.s;
    }
}num[1010];

int main(int argc, char const *argv[])
{
    cin >> n;

    for(int i = 1;i <= n;i++)
    {
        cin >> num[i].t >> num[i].s;
        if(num[i].t > num[i].s)
        {
            cout << -1;
            return 0;
        }
        tong[i] = num[i].s - num[i].t;
    }

    sort(num+1,num+n+1);
    sort(tong+1,tong+n+1);

    long long sum = 0;
    for(int i = 1;i <= n;i++)
    {
        sum += num[i].t;
        if(sum > num[i].s)
        {
            cout << -1;
            return 0;
        }
    }

    cout << tong[1];

    return 0;
}

满分做法 AC100

建立在50分的操作上进行严谨的贪心证明。

  1. 排序每一项最晚完成的时间。
  2. 得出最晚完成的时间,并用一个中间变量存储。
  3. 枚举,用中间变量减去每一项所要花费的时间。
  4. 对结果进行判断,如果中间变量小于0,非法,输出-1;否则中间变量剩余的时间就是答案,也就是商人最晚起床时间。
#include<bits/stdc++.h>
using namespace std;

int n = 0;

struct edge{
    int t,s;
    bool operator < (const edge &qxq)
    {
        return s > qxq.s;
    }
}num[1010];

int main(int argc, char const *argv[])
{
    cin >> n;

    for(int i = 1;i <= n;i++)
    {
        cin >> num[i].t >> num[i].s;
    }

    sort(num+1,num+n+1);

    int ans = num[1].s;
    for(int i = 1;i <= n;i++)
    {
        if(ans <= num[i].s) ans -= num[i].t;
        else ans = num[i].s - num[i].t;
    }

    if(ans < 0) cout << "-1";

    else cout << ans;

    return 0;
}

原文地址:https://www.cnblogs.com/Chicago/p/9920857.html

时间: 2024-08-06 18:00:51

题解 P2920 【[USACO08NOV]时间管理Time Management】的相关文章

bzoj1620 / P2920 [USACO08NOV]时间管理Time Management

P2920 [USACO08NOV]时间管理Time Management 显然的贪心. 按deadline从大到小排序,然后依次填充时间. 最后时间为负的话那么就是无解 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define re register 6 using namespace std; 7 int max(int a,in

bzoj1620[Usaco2008 Nov]Time Management 时间管理*

bzoj1620[Usaco2008 Nov]Time Management 时间管理 题意: n个任务,每个有一个所需时间和最晚完成时刻,问最晚要从什么时候开始工作.n≤1000 题解: 贪心,按最晚完成时刻从早到晚排序,如果当前任务来不及完成,就将前面的任务往前推,否则累积一个“自由时间”.当推任务时,如果之前有“自由时间”,就用自由时间减往前推的时间,否则用最晚开始时间去减往前推的时间.反思:我开始贪错了,按最晚开始时刻从早到晚排序,结果WA很久.现在还是想不太清楚原因,希望哪位神犇能帮我

1620: [Usaco2008 Nov]Time Management 时间管理

1620: [Usaco2008 Nov]Time Management 时间管理 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 506  Solved: 306[Submit][Status] Description Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs convenien

[BZOJ] 1620: [Usaco2008 Nov]Time Management 时间管理

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

BZOJ 1620: [Usaco2008 Nov]Time Management 时间管理( 二分答案 )

二分一下答案就好了... ---------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<cctype> #include<iostream> #define rep( i , n ) for( int i

bzoj1620:时间管理

1620: [Usaco2008 Nov]Time Management 时间管理 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 571  Solved: 343[Submit][Status][Discuss] Description Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs

Linux系统的时间管理及优化

一直以来对Linux下的时间管理知之不详,GFree_wind在微博发起过几次Linux下时钟的讨论,和Godbach这些大牛比,我完全插不上话,因为不懂.近来闲暇时间研究了下Linux下的时间管理,分享出来,请大家指正.   从我们大白话的角度想,时间管理其实分成两部分,就像我们小时候学习物理的时候物理老师不断强调时间和时刻的区别.一个是时刻,比如现在是20:44:37秒,指的是时刻,我们手机上看时间,指的也是时刻.另一块是时间,比如说,我每天工作八小时,再比如说,半小时之后,我要出门了,结束

时间管理

时间是一种快速移动的资产,你所拥有的时间就是那么多.如何运用你所拥有的时间对于你的前程来说,将是至关重要的. 从许多方面来说,时间是你最宝贵的商品----浪费它的风险必须由你自己来承担. 每个人每周都有168个小时,或者每月大约有720个小时的时间.每个小时呢对于我们来说都是非常重要的. 今天我们要讨论的是时间管理,首先我们必须得明白什么是时间管理?时间管理总的来说就是运用策略和技术,帮助你尽可能有效的利用你的时间. 现在我们知道了什么是时间管理,那我们要怎么去做呢? 1.首先我们得想想我们的时

花10万学时间管理,还不如明白这两个字

1 A是个很勤奋的人,无论是工作.学习还是社交,都很忙很忙.他经常挂在嘴边的话便是时间不够用. 于是,他找了一大堆时间管理书籍,还报了培训班,研究啊研究,用了不知道多少工具,尝试了不知道多少种方法. 过了很长一段时间后,朋友们见他,他还是会说时间不够用啊不够用.生活状态还是跟以前一样,忙而乱,没成绩. 2 其实我们很多人都跟A一样,一旦发觉自己的时间不够用,效率低,可能首先考虑的就是学习时间管理,问各种工具方法. 然后发现,大部分努力成了然并卵,时间一过,还是老样子. 最近,我也在琢磨这个问题,