尼克的任务题解

题目描述

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

尼克的一个工作日为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

【题解】

我们可以以时间为状态\(f[i]\)表示区间\([1,n]\)最大的休闲时间

对于每一个\(f[i]\)有两个决策:

1.不选。此时在时间i没有工作可以做\(f[i]=f[i+1]+1\)

2.选。对于每一个以i开始人物进行遍历取\(f[i]=\max\{f[i],f[j+T[i].time]\}\)

请注意排序

所以有代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
struct Node {
    int l,time;
    bool operator<(const Node &x)const {
        return l<x.l;
    }
} T[10100];

int main() {
    int n,m,f[10100]={0},cnt[10100]= {0},p=1;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=m; i++) {
        scanf("%d%d",&T[i].l,&T[i].time);
        cnt[T[i].l]++;
    }
    sort(T+1,T+1+m);
    f[n]=0;
    for(int i=n; i>=1; i--) {
        if(cnt[i]==0)
            f[i]=f[i+1]+1;
        else
            for(int j=1; j<=cnt[i]; j++) {
                f[i]=max(f[i],f[i+T[p].time]);
                p++;
            }
    }
    printf("%d\n",f[n]);
    return 0;
}

原文地址:https://www.cnblogs.com/kcfzyhq/p/8475576.html

时间: 2024-10-14 12:49:18

尼克的任务题解的相关文章

Luogu P1280 尼克的任务题解

思路 首先我们需要知道主角可以休息的最多的时间,那么我们可以设\(dp[i]\)为第\(i\)分钟可以休息的最大时间那么我们可以发现假如第\(i\)分钟没有主角没有任何任务,那么主角就可以放心休息转移方程为\(dp[i] = dp[i + 1] + 1\).如果主角在当前第\(i\)分钟里面有任务那么在\(i \sim i + t - 1\)这段时间里面就别想休息了(\(t\)为当前任务的时间).所以我们可以得到转移方程为\(dp[i] = dp[i + t]\) 最后注意一下枚举的顺序就可以了

1280 尼克的任务

难度:普及+/提高 题目类型:动规 提交次数:1 涉及知识:线性动规 题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完戍,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由

TYVJ P1034 尼克的任务 Label:倒推dp

背景 题库靠大家,人人都爱它. 描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去写成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持

Kaggle泰坦尼克数据科学解决方案

原文地址如下: https://www.kaggle.com/startupsci/titanic-data-science-solutions 看完一遍,什么也没记住,于是干脆直接翻译一遍. 然鹅,依旧没记住什么. ---------------------------------------------------------------- p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun } p.p1 { margin:

洛谷 P1280 尼克的任务 ( 线性DP )

题意 :  尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成.尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

P1280 尼克的任务(DP)

题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束.当尼克到达单位后他就开始干活.如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成.如果某任务于第P分钟开始,持续时间为T分钟,则该任务将

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)