P1280 尼克的任务(DP)
题目描述
尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成。
尼克的一个工作日为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。
输出格式:
输出文件仅一行,包含一个整数,表示尼克可能获得的最大空暇时间。
输入输出样例
题解:
让我们求他的最大空闲时间,第i时刻的最大空闲时间是和后面i+选择任务的持续时间的时刻有关系的,所以我们要从后面倒着来试一下
1、从后面 如果这个位置没有任务那就比之前的一个空闲时间+1,即dp[i]=dp[i+1]+1
2、如果有任务那就dp[i]=dp[i+任务耗时]
因为我们从后往前搞,所以我们要对任务排序,顺序无所谓,我们还要用二分来确定它的这个时刻有无任务
我们要注意这个任务在同一个时刻可能有多个,所以我们排序后用二分查找,不一定找到了这一群相同值的哪一个任务,所以我们要在这个点出,往前往后搜一下有没有值一样的
上代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 using namespace std;
6 const int maxn=10005;
7 int v[maxn],dp[maxn];
8 struct shudui
9 {
10 int start,last;
11 }w[maxn];
12 bool mmp(shudui x,shudui y)
13 {
14 return x.start<y.start;
15 }
16 int searchs(int x,int n)
17 {
18 int l=1,r=n,mid,ans=-1;
19 while(l<=r)
20 {
21 mid=(l+r)/2;
22 if(w[mid].start>=x)
23 {
24 r=mid-1;
25 ans=mid;
26 }
27 else if(w[mid].start<x)
28 {
29 l=mid+1;
30 //ans=mid;
31 }
32 }
33 return ans;
34 }
35 int main()
36 {
37 int n,k,flag=0;
38 scanf("%d%d",&n,&k);
39 for(int i=0;i<k;++i)
40 {
41 scanf("%d%d",&w[i].start,&w[i].last);
42 if(w[i].start==1)
43 {
44 if(w[i].start+w[i].last>n) flag=1;
45 }
46 }
47 if(flag)
48 {
49 printf("0\n");
50 }
51 else
52 {
53 sort(w,w+k,mmp);
54 for(int i=n;i>=1;--i)
55 {
56 int temp=searchs(i,k);
57 if(temp>0 && w[temp].start==i)
58 {
59 //printf("%d\n",i);
60 int x1=temp,x2=temp;
61 while(1)
62 {
63 if(w[x1].start!=i && w[x2].start!=i) break;
64
65 if(w[x1].start==i)
66 dp[i]=max(dp[i],dp[i+w[x1].last]),x1++;
67
68 if(w[x2].start==i)
69 dp[i]=max(dp[i],dp[i+w[x2].last]),x2--;
70 }
71 }
72 else dp[i]=dp[i+1]+1;
73 }
74 printf("%d\n",dp[1]);
75 }
76
77 return 0;
78 }
P1280 尼克的任务(DP)的更多相关文章
- 洛谷P1280 尼克的任务[DP]
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 洛谷P1280 尼克的任务 [DP补完计划]
题目传送门 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从 ...
- P1280 尼克的任务 /// DP(选择性地)
题目大意: https://www.luogu.org/problemnew/show/P1280 题解 手推一遍思路更清晰 #include <bits/stdc++.h> using ...
- P1280 尼克的任务 dp
思路: 倒着DP f[i]表示i时刻的空闲时间最大值 在当前时间没有任务开始 f[i]=f[i+1]+1; 上一分钟最大空闲时间+1 在当前时间有任务开始 f[i]=max(f[i],f[i ...
- P1280 尼克的任务 线性DP
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- P1280 尼克的任务[区间覆盖dp]
题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...
- 洛谷P1280 尼克的任务【线性dp】
题目:https://www.luogu.org/problemnew/show/P1280 题意: 给定k个任务的开始时间和持续时间要求在n时间内完成.问如何安排工作使得休息时间最多. 思路: 用d ...
- 【Luogu】P1280尼克的任务(DP)
做顺序DP做惯了,死活没想到这是个倒序DP. f[i]表示时刻i的最大空闲时.有以下两种可能. 1.时刻i没有任务.此时f[i]=f[i+1]+1; 2.时刻i有许多任务.此时f[i]=max(f[i ...
- 洛谷 P1280 尼克的任务 (线性DP)
题意概括 线性资源分配的问题,因为空闲的时间大小看后面的时间(反正感觉这个就是个套路)所以从后往前DP. 转移方程 如果当前时刻没有工作 f[i]=f[i+1]+1 如果当前时刻有工作 f[i]=ma ...
随机推荐
- oop的三大特性和传统dom如何渲染
OOP的三大特性是什么: 封装 :就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系继承:子类自动继承其父级类中的属性和方法,并可以添加新的属性和方法或者对部分属性和方法进行重写.继承增加了 ...
- 【分布式锁的演化】终章!手撸ZK分布式锁!
前言 这应该是分布式锁演化的最后一个章节了,相信很多小伙伴们看完这个章节之后在应对高并发的情况下,如何保证线程安全心里肯定也会有谱了.在实际的项目中也可以参考一下老猫的github上的例子,当然代码没 ...
- 纯原生javascript下拉框表单美化实例教程
html的表单有很强大的功能,在web早期的时候,表单是页面向服务器发起通信的主要渠道.但有些表单元素的样式没办法通过添加css样式来达到满意的效果,而且不同的浏览器之间设置的样式还存在兼容问题,比如 ...
- 【Shell】使用awk sed获取一行内容的两个值
突然有需求需要一个脚本,同时获取到每一行数据的两个值,下面做了一个例子模板,仅供记录参考 cat test.txt id=1,name=zclinux1 id=2,name=zclinux2 id= ...
- 利用vbs隐藏dos窗口
方法一: option explicitdim wshshellset wshshell=wscript.createobject("wscript.shell")wshshell ...
- Description Resource Path Location Type Failure to transfer org.apache.maven.plugins:maven-surefire-
url:https://www.pianshen.com/article/8003307916/ Description Resource Path Location Type Failure to ...
- mybatis-plubs条件构造器中的方法所对应的sql语法
[通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...
- uni-app开发经验分享十九: uni-app对接微信小程序直播
uni-app对接微信小程序直播 1.登录微信小程序后台-点击>设置->第三方设置->添加直播插件 2.添加直播组件后->点击<详情> 记录这两个参数直播 ...
- jackson学习之三:常用API操作
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Python+Selenium+Unittest实现PO模式web自动化框架(8)
1.main.py模块的功能 最后就是要有一个项目入口,并且是需要加载测试用例集. # --^_^-- coding:utf-8 --^_^-- # @Remark:运行入口 "" ...