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\)才是最优的.我们直观上考虑前 ...
随机推荐
- Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果
Blazor HyBrid在香橙派(Ubuntu Arm)运行的效果 准备香橙派一块!当前教程使用的是香橙派5 4G开发板 准备.NET环境 安装.NET Core依赖 sudo apt instal ...
- CreateProcess error=2, 系统找不到指定的文件。
遇到一个android 配置.gradle时提示CreateProcess error=2, 系统找不到指定的文件 于是百度有很多这类答案,如:干掉NDK 我按照这么做了,最后顽固的bug 并没有理睬 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建
1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了.其实在各大博客和公众号也看到过其相关的介绍和讲解.要不就是不全面.不系统,要不就是系统 ...
- elment UI + EasyExcel 实现 导入
前端组件 <hd-flex> <el-dialog v-model="isUploadDialog" width="50%" lock-scr ...
- Hbase的JavaAPI和数据存储
导入Maven依赖 <dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> ...
- CKS 考试题整理 (11)-沙箱运行容器gVisor
Context 该 cluster使用 containerd作为CRI运行时.containerd的默认运行时处理程序是runc. containerd已准备好支持额外的运行时处理程序runsc (g ...
- 深入剖析创建Java虚拟机的实现方法
经过前文<深入剖析java.c文件中JavaMain方法中InitializeJVM的实现>的分析,找到了创建Java虚拟机具体实现的方法Threads::create_vm((JavaV ...
- C++面试八股文:什么是智能指针?
某日二师兄参加XXX科技公司的C++工程师开发岗位第19面: 面试官:什么是智能指针? 二师兄:智能指针是C++11引入的类模板,用于管理资源,行为类似于指针,但不需要手动申请.释放资源,所以称为智能 ...
- 【LeetCode摩尔投票】有趣的简单题:数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 https://leetcode.cn/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-l ...
- [python] 基于matplotlib-scalebar库绘制比例尺
matplotlib-scalebar是一个Python库,用于在matplotlib图形中添加比例尺.它允许用户指定比例尺的大小.位置.字体和颜色,以及比例尺的单位.该库支持不同的比例尺单位,例如米 ...