题目描述

尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。

尼克的一个工作日为 \(n\) 分钟,从第 \(1\) 分钟开始到第 \(n\) 分钟结束。当尼克到达单位后他就开始干活,公司一共有 \(k\) 个任务需要完成。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第 \(p\) 分钟开始,持续时间为 \(t\) 分钟,则该任务将在第 \((p+t−1)\) 分钟结束。

写一个程序计算尼克应该如何选取任务,才能获得最大的空暇时间。

输入格式

输入数据第一行含两个用空格隔开的整数 \(n\) 和 \(k\)。

接下来共有 \(k\) 行,每一行有两个用空格隔开的整数 \(p\) 和 \(t\),表示该任务从第 \(p\) 分钟开始,持续时间为 \(t\) 分钟。

输出格式

输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。

输入输出样例

输入 #1

15 6

1 2

1 6

4 11

8 5

8 1

11 5

输出 #1

4

说明/提示

数据规模与约定

对于 \(\%100\) 的数据,保证 \(1 \leq n \leq 10^4,1 \leq k \leq 10^4,1 \leq p \leq n,1 \leq p+t-1 \leq n\)

solution

又双叒叕来刷\(DP\)水题难题了

一开始我从任务排序之后来做 \(DP\), 经历现实的毒打之后就放弃了这种\(naive\)的想法。

于是我们考虑直接从时间角度来递推:

考虑 \(f[i]\) 表示从第 \(i\) 分钟到末尾的最大休息时间。

对于每一个任务,我们记录它们的起始时间,这个起始时间可以从它的结束时间转移而来。

而如果在某个时间没有起始任务,就可以先当成尼克在这个时间点进行休息。

于是乎我们有如下 \(DP\):

\(\left\{\begin{array}\\f[i-1]+1,start[i]==0\\f[i + t[j]],j\in start[i] \end{array}\right.\)

\(start[i]\) 表示从时间点\(i\) 开始的任务集合。但其实记录的时候只需要记下个数就好,我们拍好顺序从后往前推便可以求得哪些工作是以\(i\) 为起始时间。

Code

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repd(i,a,b) for(int i=a;i>=b;i--)
#define _(d) while(d(isdigit(ch=getchar())))
template <class T> void g(T&t){T x,f=1;char ch;_(!)ch=='-'?f=-1:f;x=ch-48;_()x=x*10+ch-48;t=f*x;}
const int N=1e4+4;
struct A{
int l, t;
bool operator<(const A rhs)const{
return l > rhs.l;
}
}a[N];
int n, k, f[N], s[N];
int main(){
g(n), g(k);
rep(i, 1, k){
g(a[i].l), g(a[i].t);
s[a[i].l]++;
}
sort(a+1, a+1+k);
int id=1;
repd(i, n, 1){
if( !s[i] ) f[i]=f[i+1] + 1;
else{
rep(j, 1, s[i]){
f[ i ]=max( f[ i ], f[ i + a[id].t ] );
id ++;
}
}
}
printf("%d\n",f[1]);
return 0; }

最新文章

  1. .Net WinForm下配置Log4Net(总结不输出原因)
  2. Python学习资料整理以及书籍、开发工具推荐
  3. 微分方程&mdash;&mdash;包络和奇解
  4. jquery常用正则表达式
  5. mysql创建每月执行一次的event
  6. Nancy 简单学习
  7. 1、Hadoop架构
  8. uva 558 - Wormholes(Bellman Ford判断负环)
  9. 在ajax当中使用url重写来避免url的暴露
  10. C#开发学习——内联表达式
  11. osg复制多个相同物体修改材质属性问题
  12. 【Android】创建Popwindow弹出菜单的两种方式
  13. Oracle 多行转多列
  14. vbs鼠标方法——模拟鼠标按键
  15. partial 函数
  16. PHP中的date函数中时区问题
  17. sql 语句写的行列转换
  18. java web项目部署到tomcat 8.5 此驱动程序不支持 Java Runtime Environment (JRE) 1.8 版。请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库
  19. MAC使用超级终端
  20. Selenium3 + Python3自动化测试系列五——常用断言Assertion

热门文章

  1. pytest之将多个测试用例放在一个类中,生成唯一临时文件夹
  2. 【字符串算法】AC自动机
  3. DevOps元素周期表—2号元素Kibana
  4. vue使用vueCropper裁剪功能,代码复制直接使用
  5. shiro入门学习--授权(Authorization)|筑基初期
  6. Flink深入浅出: 应用部署与原理图解(v1.11)
  7. Windows7 提示“无法访问您可能没有权限使用网络资源”的解决办法
  8. 初探电波钟(A Brief Introduction Of Radio Controlled Clock AND Its Appliciations)
  9. 炉石传说酒馆战棋一键拔线(windows)
  10. golang常用库:字段参数验证库-validator