NC16850 [NOI1998]免费馅饼
题目
题目描述
SERKOI最新推出了一种叫做“免费馅饼”的游戏:游戏在一个舞台上进行。舞台的宽度为W格,天幕的高度为H格,游戏者占一格。开始时游戏者站在舞台的正中央,手里拿着一个托盘。下图为天幕的高度为4格时某一个时刻游戏者接馅饼的情景。
游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或向右移动一格或两格,也可以站在原地不动。
馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。同时,在8-308电脑的遥控下,各种馅饼下落的速度也是不一样的,下落速度以格/秒为单位。
当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。
写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。
输入描述
第一行是用空格隔开的两个正整数,分别给出了舞台的宽度W(1到99之间的奇数)和高度H(1到100之间的整数)。
接下来依馅饼的初始下落时间顺序给出了所有馅饼的信息。每一行给出了一块馅饼的信息。由四个正整数组成,分别表示了馅饼的初始下落时刻(0到1000秒),水平位置、下落速度(1到100)以及分值。游戏开始时刻为0。从1开始自左向右依次对水平方向的每格编号。
输入文件中同一行相邻两项之间用一个或多个空格隔开
输出描述
第一行给出了一个正整数,表示你的程序所收集的最大分数之和。
其后的每一行依时间顺序给出了游戏者每秒的决策。输出0表示原地不动、1或2表示向右移动一步或两步、-1 或-2表示向左移动一步或两步。输出应持续到游戏者收集完他要收集的最后一块馅饼为止
示例1
输入
3 3
0 1 2 5
0 2 1 3
1 2 1 3
1 3 1 4
输出
12
-1
1
1
题解
知识点:线性dp。
显然不能模拟馅饼掉落,复杂度太高。考虑线性dp。
先找到可能掉到高度为 \(1\) 的地方馅饼,因为其他馅饼不可能被获得。在把时间作为一轴,横坐标作为水平位置,开一个数组 \(a\) 标记馅饼,一个馅饼如果在 \(t\) 时掉在水平位置 \(x\) 处,则其价值应该存于为 \(a[t][x]\) 。这样就表达了整个题目的有效信息。
一个馅饼在 \(w\) 的当前仅当速度 \(v\) 整除实际掉落高度 \(H-1\) 时,才一定会在 \(t+\frac{H-1}{v}\) 时刻掉落到高度为 \(1\) 的地方从而有可能被吃掉,而我们只需要记录这种馅饼的价值在 \(a[t+\frac{H-1}{v}][w]\) 即可。并且我们顺便可以把最晚落下的馅饼时间记录在 \(maxt\) ,作为一个时间边界。
但是注意这里不只是求最大价值,还要求路径。
试想如果我们正推,从起点 \(\lfloor \frac w2 \rfloor +1\) 开始,出发从第 \(0\) 秒推到 \(maxt\) ,我们最后可以通过枚举 \(dp[maxt][1\cdots w]\) 中的最大值作为答案,但是找路径推回去会有个问题,上一时刻同时存在很多个点是潜在上一个路径点,我们要保证逆推要推回唯一起点,但我们不确定这些点哪个点可行的,如果枚举这些点一定超时,当然你也可以一开始推的时候就只推起点能到的点,第一秒可能只推五个,第二秒可能推九个,其他点都是负无穷,大概也是可以,但这过于麻烦。我们完全可以从第 \(maxt\) 秒逆推回第 \(0\) 秒,然后答案就是 \(dp[0][\lfloor \frac w2 \rfloor +1]\) ,而路径直接从 \((0,\lfloor \frac w2 \rfloor +1)\) 逆推,无论推到哪里都是合法的,因为起点固定了。这样就做完了。
时间复杂度 \(O(w(H+t))\)
空间复杂度 \(O(w(H+t))\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[1107][107];
int dp[1107][107];
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int W, H;
cin >> W >> H;
int t, w, v, s;
int maxt = 0;
while (cin >> t >> w >> v >> s) {
if ((H - 1) % v == 0) {
a[t + (H - 1) / v][w] += s;
maxt = max(maxt, t + (H - 1) / v);
}
}
for (int i = maxt;i >= 0;i--) {
for (int j = 1;j <= W;j++) {
for (int k = -2;k <= 2;k++) {
int pos = j + k;
if (pos >= 1 && pos <= W) dp[i][j] = max(dp[i][j], dp[i + 1][pos] + a[i][j]);
}
}
}
int pre = W / 2 + 1;
cout << dp[0][pre] << '\n';
for (int i = 1;i <= maxt;i++) {
for (int j = -2;j <= 2;j++) {///不要忘了第一个要求是要走得到
int pos = pre + j;
if (pos >= 1 && pos <= W && dp[i][pos] == dp[i - 1][pre] - a[i - 1][pre]) {
cout << j << '\n';
pre = pos;
break;
}
}
}
return 0;
}
NC16850 [NOI1998]免费馅饼的更多相关文章
- NOI 1998 免费馅饼
附题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4901 时间限制(普通/Java ...
- 免费馅饼——G
G. 免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果 ...
- nyoj 613 免费馅饼 广搜
免费馅饼 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...
- HDU 1176 免费馅饼
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 1644 免费馅饼 题解(c++)(S.B.S.)
1644 免费馅饼(巴蜀oj上的编号) 题面: SERKOI最新推出了一种叫做“免费馅饼”的游戏. 游戏在一个舞台上进行.舞台的宽度为W格,天幕的高度为H格,游戏者占 ...
- 免费馅饼 Why WA
免费馅饼 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1576 Solved: 577 Description 都说天上不会掉馅饼,但有一天gameb ...
- HDU 1176免费馅饼 DP数塔问题转化
L - 免费馅饼 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- HDU 1176 免费馅饼(记忆化搜索)
免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- hdu 1176 免费馅饼(数塔类型)
http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- HDU 1176 免费馅饼(数字三角形)
免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...
随机推荐
- spring boot 整合kafka
本文为博主原创,未经允许不得转载: 1. 引入spring boot kafka依赖 <dependency> <groupId>org.springframework.kaf ...
- The project description file (.project) for XXX is missing
在STS中切换项目分支的时候,出现一个项目打不开了,提示:The project description file (.project) for XXX is missing 试了下网上的方法都没有解 ...
- DFT Architecture
Design For Test 在实际生产过程中产生的physical defect是导致芯片功能出错的根本原因 如何根据结构产生测试向量呢?主要考虑physical defect physical ...
- 【ThreadX】Azure RTOS ThreadX概述
Azure RTOS ThreadX是Microsoft的高级工业级实时操作系统(RTOS),专门用于深度嵌入式,实时和IoT应用程序.Azure RTOS ThreadX提供了高级计划,通信,同步, ...
- PHPCMS V9安装出现DNS解析失败的解决方法-不支持采集和保存远程图片
目前因为phpcms官网停止解析后,很多人安装phpcms v9出现如下错误: 这是因为检测dns解析的域名是phpcms官网的域名,官网域名停止解析后肯定检测失败.解决方法如下: 打开/ ...
- [转帖]MySQL的版本情况
Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...
- TiDB恢复部分表的方式方法
TiDB恢复部分表的方式方法 背景 今天同事告知误删了部分表. 因为是UAT准生产的环境, 所以仅有每天晚上11点的备份处理. 同时告知 昨天的数据也可以. 得到认可后进行了 TiDB的单表备份恢复. ...
- [转帖]Sysbench - 一种系统性能benchmark
SysBench是一款开源的.跨平台的.模块化的.多线程的性能测试工具,通过高负载地运行在数据库上,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.用于评估操作系统的性能参数. 1 sysb ...
- ebpf 单行程序学习
ebpf 单行程序学习 背景 公司方神借给我一本: <BPF之巅:洞悉linux系统和应用性能>纸质书 拿回家晚上在沙发上看了几天. 感觉书很厚看的不是很系统. 仅能凭自己的感觉总结一下这 ...
- 公司内部Oracle RAC测试环境的简单使用说明.
1. 公司内部要测试Oracle RAC系统的创建与测试工作. 因为Oracle RAC 主要需要 多个网段以及共享存储, 直接使用ESXi搭建比较复杂 所以我这边使用vagrant的方式搭建Orac ...