题目链接

题目

题目描述

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]免费馅饼的更多相关文章

  1. NOI 1998 免费馅饼

    附题目链接:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=4901 时间限制(普通/Java ...

  2. 免费馅饼——G

    G. 免费馅饼 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果 ...

  3. nyoj 613 免费馅饼 广搜

    免费馅饼 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy ...

  4. HDU 1176 免费馅饼

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. 1644 免费馅饼 题解(c++)(S.B.S.)

    1644 免费馅饼(巴蜀oj上的编号) 题面:          SERKOI最新推出了一种叫做“免费馅饼”的游戏.         游戏在一个舞台上进行.舞台的宽度为W格,天幕的高度为H格,游戏者占 ...

  6. 免费馅饼 Why WA

    免费馅饼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 1576  Solved: 577 Description 都说天上不会掉馅饼,但有一天gameb ...

  7. HDU 1176免费馅饼 DP数塔问题转化

    L - 免费馅饼 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  8. HDU 1176 免费馅饼(记忆化搜索)

    免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu 1176 免费馅饼(数塔类型)

    http://acm.hdu.edu.cn/showproblem.php?pid=1176 免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  10. HDU 1176 免费馅饼(数字三角形)

    免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...

随机推荐

  1. python json.loads()、json.dumps()和json.dump()、json.load()区别

    json.loads().json.dumps()和json.dump().json.load()分别是两组不同用法 带s的用于数据类型的转换,不带s的用于操作文件. json.loads().jso ...

  2. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.05)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  3. 【面试题精讲】你了解String.intern方法吗

    有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 String.intern 方法是 Java 中 ...

  4. [转帖]Oracle JDBC中的语句缓存

    老熊 Oracle性能优化 2013-09-13 在Oracle数据库中,SQL解析有几种: 硬解析,过多的硬解析在系统中产生shared pool latch和library cache liatc ...

  5. [转帖]坑:jmeter代理服务器录制脚本出现target controller is configured to "use recording Controller" but no such controller exists...

    配置好代理服务器后,运行代理服务器 run 报错: target controller is configured to "use recording Controller" bu ...

  6. [转帖]KingbaseES V8R6 中walminer的使用

    https://www.cnblogs.com/kingbase/p/17315750.html 前言 walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作.例如 ...

  7. [转帖]在KingbaseES数据库中批量创建数据库/表

    1. 问题 如何在KingbaseES中批量创建表和库? 2. 通过shell脚本文件实现 有时候我们在进行测试的时候需要进行批量的建库以及建表,这时我们可以使用shell脚本实现或者是SQL实现,s ...

  8. [转帖]记录自己安装内存带宽测试工具——Stream过程

    测试环境: CPU:Kunpeng 920 8Core MEM:16G Storage:200G OS:openEuler 20.03 (LTS-SP3) 1 服务器资源监控工具--Stream 1. ...

  9. 部分信创CPU算力与IntelCPU的简单比较

    部分信创CPU算力与IntelCPU的简单比较 摘要 最近一直想查看一下国产和非国产的CPU的性能比较 从最开始学习研究 sysbench 到周五晚上开始学习 stress-ng 今天查看github ...

  10. UnixBench的简单测试与验证

    UnixBench的简单测试与验证 目标 飞腾2000+ (物理机和虚拟机) Intel Golden 6170 物理机 Intel Golden 5218 虚拟机 Gold 5218 CPU @ 2 ...