题目链接

题目

题目描述

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. 国庆学go,完成了博客基本功能,迫不及待的发布上线了

    大家好,我是沙漠尽头的狼. 国庆7天,利用带娃之余的空闲时间学习了go,并做了一个不是很完善的博客前台网站. 网站发布地址:https://go.dotnet9.com 源码 边做边上传Github, ...

  2. DC逻辑综合工具简介-Design Compiler

    逻辑综合简介 逻辑综合:代码转变为网表 FPGA:代码转变为FPGA内部的数字单元 在进行综合的时候往往会使用一些脚本工具 需要学会看综合之后的报告 1.目标 进行综合需要读入RTL设计,还需要用到f ...

  3. JS - Array - 在数组的指定下标添加或替换元素 。 也可删除指定下标的元素

    一,首先介绍下 js Array对象 中的 splice 方法 . ( splice在英文中是剪接的意思 ) 1,定义和用法 splice() 方法用于插入.删除或替换数组的元素. 注意:这种方法会改 ...

  4. [转帖]oracle 11.2.0.4 rac集群等待事件enq: TM - contention

    近期,一金融客户oracle 11.2.0.4 rac集群delete不当导致等待事件enq: TM - contention严重引起大范围会话堆积,记录的相关分析工作如下. 1.登录集群任意节点,查 ...

  5. [转帖]PostgreSQL中的schema和user

    https://www.cnblogs.com/abclife/p/13905336.html postgresql中,用户创建的所有对象都被创建在指定的schema(或namespace)中.其他用 ...

  6. 【转帖】linux环境下使用route指令设置多个网络连接的优先级(通过修改路由表的默认网关条目)

    1. 背景 在生活中的会经常遇见一台PC同时连接多个网络的场景.最典型的,一台笔记本可以同时连接一个无线网(手机热点)和一个有线网(以太网).linux和window操作系统在默认情况都会使用最早连接 ...

  7. [转帖]Perf IPC以及CPU性能

    https://plantegg.github.io/2021/05/16/Perf%20IPC%E4%BB%A5%E5%8F%8ACPU%E5%88%A9%E7%94%A8%E7%8E%87/ Pe ...

  8. jmaps

    #!/bin/bash # # jmaps - creates java /tmp/perf-PID.map symbol maps for all java processes. # # This ...

  9. ElasticSearch集群灾难:别放弃,也许能再抢救一下 | 京东云技术团队

    ​ 1 前言 Elasticsearch作为一个分布式搜索引擎,自身是高可用的:但也架不住一些特殊情况的发生,如: 集群超过半数的master节点丢失,ES的节点无法形成一个集群,进而导致集群不可用: ...

  10. 【JS 逆向百例】网洛者反爬练习平台第三题:AAEncode 加密

    关注微信公众号:K哥爬虫,持续分享爬虫进阶.JS/安卓逆向等技术干货! 声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后 ...