题意

\(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的更多相关文章

  1. 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\ ...

  2. 1324E - Sleeping Schedule

    题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡 ...

  3. Codeforces Round #627 (Div. 3) E - Sleeping Schedule(递推)

    题意: 每天有 h 小时,有一序列 an,每次可以选择 ai 或 ai - 1 小时后睡觉,问从 0 次 0 时开始,最多在 l ~ r 时间段入睡多少次. 思路: 如果此时可达,计算此时可达的时间点 ...

  4. CF1324E Sleeping Schedule 题解

    原题链接 简要题意: 每次可以将 \(a_i\) 减 \(1\) 或不变.求让 \(a_i\) 的前缀和 \(\% h\) 的值在 \([l,r]\) 区间中的最多的个数. E题是个水dp,也不怎样 ...

  5. 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 ...

  6. 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 ...

  7. CF Educational Codeforces Round 21

    A. Lucky Year time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  8. 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 ...

  9. Codeforces Round #545 (Div. 2)(D. Camp Schedule)

    题目链接:http://codeforces.com/contest/1138/problem/D 题目大意:给你两个字符串s1和s2(只包含0和1),对于s1中,你可以调换任意两个字符的位置.问你最 ...

  10. 【Codeforces 1137B】Camp Schedule

    Codeforces 1137 B 题意:给两个串\(S\).\(T\),问将\(S\)中字符任意调换后出现\(T\)次数最多的方案. 思路:我们首先考虑怎么样放\(T\)才是最优的.我们直观上考虑前 ...

随机推荐

  1. Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果

    Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果 准备香橙派一块!当前教程使用的是香橙派5 4G开发板 准备.NET环境 安装.NET Core依赖 sudo apt instal ...

  2. CreateProcess error=2, 系统找不到指定的文件。

    遇到一个android 配置.gradle时提示CreateProcess error=2, 系统找不到指定的文件 于是百度有很多这类答案,如:干掉NDK 我按照这么做了,最后顽固的bug 并没有理睬 ...

  3. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建

    1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了.其实在各大博客和公众号也看到过其相关的介绍和讲解.要不就是不全面.不系统,要不就是系统 ...

  4. elment UI + EasyExcel 实现 导入

    前端组件 <hd-flex> <el-dialog v-model="isUploadDialog" width="50%" lock-scr ...

  5. Hbase的JavaAPI和数据存储

    导入Maven依赖 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> ...

  6. CKS 考试题整理 (11)-沙箱运行容器gVisor

    Context 该 cluster使用 containerd作为CRI运行时.containerd的默认运行时处理程序是runc. containerd已准备好支持额外的运行时处理程序runsc (g ...

  7. 深入剖析创建Java虚拟机的实现方法

    经过前文<深入剖析java.c文件中JavaMain方法中InitializeJVM的实现>的分析,找到了创建Java虚拟机具体实现的方法Threads::create_vm((JavaV ...

  8. C++面试八股文:什么是智能指针?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第19面: 面试官:什么是智能指针? 二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请.释放资源,所以称为智能 ...

  9. 【LeetCode摩尔投票】有趣的简单题:数组中出现次数超过一半的数字

    数组中出现次数超过一半的数字 https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-l ...

  10. [python] 基于matplotlib-scalebar库绘制比例尺

    matplotlib-scalebar是一个Python库,用于在matplotlib图形中添加比例尺.它允许用户指定比例尺的大小.位置.字体和颜色,以及比例尺的单位.该库支持不同的比例尺单位,例如米 ...