码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu P1280 尼克的任务题解

时间:2018-11-01 13:44:04      阅读:99      评论:0      收藏:0      [点我收藏+]

标签:put   read   putc   放心   顺序   book   write   include   sim   

思路

首先我们需要知道主角可以休息的最多的时间,那么我们可以设\(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;
}

Luogu P1280 尼克的任务题解

标签:put   read   putc   放心   顺序   book   write   include   sim   

原文地址:https://www.cnblogs.com/lixiao189/p/9888612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!