题目描述

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

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

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

输入输出格式

输入格式:

输入数据第一行含两个用空格隔开的整数N和K(1≤N≤10000,1≤K≤10000),N表示尼克的工作时间,单位为分钟,K表示任务总数。

接下来共有K行,每一行有两个用空格隔开的整数P和T,表示该任务从第P分钟开始,持续时间为T分钟,其中1≤P≤N,1≤P+T-1≤N。

输出格式:

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

输入输出样例

输入样例#1:

15 6
1 2
1 6
4 11
8 5
8 1
11 5
输出样例#1:

4

solution:
这道题首先看到的肯定是DP,是资源分配类型的DP。
首先这道题说的是尼克要挑选任务,其余同等时间内其他的任务就由同事来做,那么问题来了,当有任务时尼克应该如何挑选最优的任务
这时题目问啥我们就设啥,设dp[i]表示当前可以歇的最大时间
首先考虑的是DP的转移。枚举每一个时间,如果当前时间无任务,那么就是现在可以歇的时间=上一分钟可以歇的最大时间+1。
如果当前有任务,那么就要挑选当前时刻最优的任务,枚举每一个任务,如果当前有需要开始的任务,dp[i]=max(dp[i+wj],dp[i]),如果挑选当前任务,那么当前任务的代价就是执行的时间wj,就直接跳到wj+1的时间,如果不挑选,则无代价。
所以现在我们的dp方程就求出来了
  if !vis[i]//vis用来记录当前有无任务的开始
    dp[i] = dp[i-1]+1;
  else
  {
    for j -> k
    dp[i] = max(dp[i+wj],dp[i]);
  }
现在我们是从正向枚举的时间,但是我们从某谷上评测时,会发现

那么问题到底出现在哪呢?

如果正向枚举时间,他就会有时间性的跳跃,导致转移

嗯,大概就是这样,dp[i+wj]是空的

而你倒序枚举时间(请自行画图脑补),就会有时间性转移

算了,我手勤,图在下面

嗯,好了,剩下的就是代码了

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct edge
{
int sta,end,w;
}e[];
int n , k , dp[] , tot , vis[];
bool cmp(edge x,edge y)
{
return x.sta > y.sta;
}
int main()
{
cin >> n >> k;
for(int i = ;i <= k;i ++)
{
int w;
cin >> e[i].sta >>w;
e[i].end = w;
vis[e[i].sta]++;
}
sort(e+,e++n,cmp);
for(int i = n;i >= ;i --)
{
if(vis[i] == )
dp[i]=dp[i+]+;
else
{
for(int j = ;j <= k;j ++)
if(e[j].sta == i)
dp[i] = max(dp[i+e[j].end],dp[i]);
}
}
cout << dp[];
}

最新文章

  1. hadoop启动是常见小问题
  2. PostrgreSQL 表名大小些问题(public.&quot;tablename&quot;)
  3. hdu 1518 拼正方形
  4. java AES加密算法
  5. Bootstrap--组件之Glyphicons字体图标
  6. js 中的流程控制-循环(for)语句
  7. JavaScript 的setAttribute兼容性解决
  8. linux软与硬接线连接
  9. 把windows的bat用好了,也很不错
  10. Bootstrap 输入组
  11. JVM学习笔记三:垃圾收集器与内存分配策略
  12. accp8.0转换教材第11章JAjax加护扩展理解与练习
  13. FPGA在电平接口领域的应用
  14. hadoop配置遇到问题的解决
  15. bugku web 管理员系统
  16. 《团队作业》五小福团队--UNO的博客链接汇总
  17. Spring Cloud微服务笔记(三)服务治理:Spring Cloud Eureka快速入门
  18. [原]Docker-issue(2) http: server gave HTTP response to HTTPS client
  19. guxh的python笔记十:包和模块
  20. Perfect hashing (And Minimal perfect hashing)

热门文章

  1. Windows身份验证和混合验证的差别
  2. 2)Win10-UWA开发 API參考 - 1
  3. iOS UI08_UITableView
  4. RAC连接时的2种方式Connect Time Failver和taf
  5. systemd服务管理---systemctl命令列出所有服务
  6. Linux就该这么学 20181003(第四章Vim/shell/测试条件)
  7. 乔治&#183;霍兹(George Hotz):特斯拉、谷歌最可怕的对手!
  8. ajax的cache缓存的使用方法
  9. Oracle查询当前用户下的所有表及sqlplus 设置 列宽
  10. STM8S103之时钟设置