Luogu P1280 尼克的任务题解

思路

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

代码

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e4 + 5 ;

int n, k;
int book[N];
int dp[N];

struct STR {
    int ts; //任务开始的时间
    int t;  //任务持续的时间
} Str[N];

int read() {
    int s = 0, w = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        s = s * 10 + ch - '0';
        ch = getchar();
    }
    return s * w;
}

void write(int x) {
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + '0');
}


int main(int argc, char const *argv[]) {
    n = read(), k = read();
    for (register int i = 1; i <= k; ++i) { 
        Str[i].ts = read(), Str[i].t = read();
        book[Str[i].ts] = 1; //标记开始的时间
    }
    for (register int i = n; i >= 1; --i) { //枚举时间
        if (!book[i]) {
            dp[i] = dp[i + 1] + 1;
            continue;
        }
        for (register int j = 1; j <= k; ++j) { //枚举任务
            if (Str[j].ts == i) 
                dp[i] = max(dp[i], dp[i + Str[j].t]);
        }
    }
    write(dp[1]);
    return 0;
}

转载于:https://www.cnblogs.com/lixiao189/p/9888612.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值