CodeForces-1324E-Sleeping-Schedule
题意
\(Vova\)有一个睡眠时间表,一天有\(h\)小时,\(Vova\)会睡\(n\)次觉,一次睡一天,在第\(i-1\)次睡醒后,\(Vova\)在\(a_i\)或\(a_i-1\)个小时候可以再次入睡,一开始时间为第\(0\)时(可以视作\(Vova\)刚醒),\(Vova\)在\([l,r]\)区间时睡觉会睡得舒服,问\(Vova\)最多可以睡几次舒服觉
分析
发现第\(i\)次睡眠的时间是由第\(i-1\)次睡眠时间决定的,一个显然的转移,因此这道题采用\(DP\)
首先我们可以设第\(0\)次睡眠时,\(Vova\)是在第\(0\)时刻睡的
假设\(Vova\)在第\(i-1\)次睡眠时在第\(j\)时刻,那么第\(i\)次\(Vova\)可以在第\((j+a_i)\%h\)时刻或者在第\((j+a_i-1)\%h\)时刻睡觉,我们可以记录一个\(vis[i][j]\)表示\(Vova\)在第\(i\)次睡眠时在第\(j\)时刻可以睡
而如果\((j+a_i)\%h\)在\([l,r]\)区间内,则第\(i\)次睡眠在第\((j+a_i)\%h\)时刻的答案数为第\(i-1\)次睡眠时\(j\)时刻的答案数加一,因为有多种方案使得\(Vova\)能在第\(i-1\)次睡眠时在第\(j\)时刻,因此取最大值,可以记录\(dp[i][j]\)表示在第\(i\)次睡眠时在第\(j\)时刻的答案,\(dp[i][(j+a_i)\%h]=max(dp[i-1][j]+1,dp[i][(j+a_i)\%h])\)
如果\((j+a_i)\%h\)不在\([l,r]\)区间内,则\(dp[i][(j+a_i)\%h]=max(dp[i-1][j],dp[i][(j+a_i)\%h])\)
答案可以在每次更新\(dp[i][j]\)时更新
\((j+a_i-1)\%h\)同理
这题不卡空间,可以不使用滚动数组
#pragma GCC optimize(3, "Ofast", "inline")
#include <bits/stdc++.h>
#define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define int ll
#define ls st<<1
#define rs st<<1|1
#define pii pair<int,int>
using namespace std;
const int maxn = (ll) 3e5 + 5;
const int mod = 1000000007;
const int inf = 0x3f3f3f3f;
int dp[2005][2005];
bool vis[2005][2005];
int ans;
signed main() {
start;
int n, h, l, r;
cin >> n >> h >> l >> r;
vis[0][0] = true;
for (int i = 1; i <= n; ++i) {
int x;
cin >> x;
for (int j = 0; j < 2000; ++j) {
if (vis[i - 1][j]) {
int t = (j + x) % h;
vis[i][t] = true;
if (t >= l && t <= r)
dp[i][t] = max(dp[i][t], dp[i - 1][j] + 1);
else
dp[i][t] = max(dp[i][t], dp[i - 1][j]);
ans = max(ans, dp[i][t]);
t = (j + x - 1) % h;
vis[i][t] = true;
if (t >= l && t <= r)
dp[i][t] = max(dp[i][t], dp[i - 1][j] + 1);
else
dp[i][t] = max(dp[i][t], dp[i - 1][j]);
ans = max(ans, dp[i][t]);
}
}
}
cout << ans;
return 0;
}
CodeForces-1324E-Sleeping-Schedule的更多相关文章
- Codeforces 1324E Sleeping Schedule DP
题意 给你一个长度为\(n\)的数组\(a\)和3个数字\(h,l和r\).\(t\)初始为0,每次可以使\(t=(t+a_i) \% h\)或者\(t=(t+a_i-1)\%h\),如果这时\(t\ ...
- 1324E - Sleeping Schedule
题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡 ...
- Codeforces Round #627 (Div. 3) E - Sleeping Schedule(递推)
题意: 每天有 h 小时,有一序列 an,每次可以选择 ai 或 ai - 1 小时后睡觉,问从 0 次 0 时开始,最多在 l ~ r 时间段入睡多少次. 思路: 如果此时可达,计算此时可达的时间点 ...
- CF1324E Sleeping Schedule 题解
原题链接 简要题意: 每次可以将 \(a_i\) 减 \(1\) 或不变.求让 \(a_i\) 的前缀和 \(\% h\) 的值在 \([l,r]\) 区间中的最多的个数. E题是个水dp,也不怎样 ...
- Educational Codeforces Round 21(A.暴力,B.前缀和,C.贪心)
A. Lucky Year time limit per test:1 second memory limit per test:256 megabytes input:standard input ...
- Average Sleep Time CodeForces - 808B (前缀和)
It's been almost a week since Polycarp couldn't get rid of insomnia. And as you may already know, on ...
- CF Educational Codeforces Round 21
A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Codeforces Round #325 (Div. 2) A. Alena's Schedule 水题
A. Alena's Schedule Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/586/pr ...
- Codeforces Round #545 (Div. 2)(D. Camp Schedule)
题目链接:http://codeforces.com/contest/1138/problem/D 题目大意:给你两个字符串s1和s2(只包含0和1),对于s1中,你可以调换任意两个字符的位置.问你最 ...
- 【Codeforces 1137B】Camp Schedule
Codeforces 1137 B 题意:给两个串\(S\).\(T\),问将\(S\)中字符任意调换后出现\(T\)次数最多的方案. 思路:我们首先考虑怎么样放\(T\)才是最优的.我们直观上考虑前 ...
随机推荐
- 【Linux】(小白向)详解VirtualBox网络配置-配置Linux网络
本文时间 2023-05-18 作者:sugerqube漆瓷 本文面向新手,重在理解会舍弃不少精密的理论,还请大佬们见谅. 本文目标:成功使用ssh工具登录linux,同时linux能连接外网. 网络 ...
- Clumpify:能使 Fastq 压缩文件再缩小 30% 并加速后续分析流程
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. Clumpify 是 BBMap 工具包中的一个组件,它与其他工具略有不同的是 Clumpif ...
- Python time strftime() 方法的使用
1.描述 strftime() 用于格式化时间,返回以可读字符串表示的时间,格式自定义. 2.说明 python中日期和时间的格式化符号有很多,下面列举常用的符号: %y 两位数的年份表示(00-9 ...
- Oracle rac环境的数据库导入操作记录
搞某一大项目的性能测试,将Oracle数据库dmp文件(211G)导入性能测试环境. 因为Oracle部署方式为rac,数据存储到共享磁盘.但由于对rac了解不足,这个过程中犯了两个错误: ① 表空间 ...
- 某表格常用api
这是一个神奇的网站,可作为免费的数据存储平台,已白嫖多年 通过调用接口可以方便的实现增删改查.修改www前缀为vip,还能嫖vip服务器 我常常用来写入程序的日志记录,记录/更新一些关键key 不需要 ...
- Junit执行器Runner探索之旅
单元测试是每个程序员必备的技能,而Runner是每个单元测试类必有属性.本文通过解读Junit源码,介绍junit中每个执行器的使用方法,让读者在单元测试时,可以灵活的使用Runner执行器. 一.背 ...
- 基于 canal 的 RDS Mysql 数据实时同步到 Es 服务器
背景 考虑到我们的数据在密码变大,与数据分析的需求,前面我们是一直在使用 Sphinx 来做全文搜索.主要也是这块我们也没有更为核心的Sphinx 开发人员,从而我们在这块的使用上,一直都还是还有比较 ...
- Custom directive is missing corresponding SSR transform and will be ignored
背景 最近在给业务组件库集成指令库,将各个项目中常用的指令如一键复制.元素和弹窗拖拽等封装到一起,进行统一发版维护. 业务组件库项目架构采用的是pnpm+vite+vue3+vitepress,其中v ...
- 学生课程分数的Spark SQL分析
读学生课程分数文件chapter4-data01.txt,创建DataFrame. url = "file:///D:/chapter4-data01.txt" rdd = spa ...
- 如何在long-running task中调用async方法
什么是 long-running thread long-running task 是指那些长时间运行的任务,比如在一个 while True 中执行耗时较长的同步处理. 下面的例子中,我们不断从队列 ...