题目链接

题目

题目描述

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. spring boot 整合kafka

    本文为博主原创,未经允许不得转载: 1. 引入spring boot kafka依赖 <dependency> <groupId>org.springframework.kaf ...

  2. The project description file (.project) for XXX is missing

    在STS中切换项目分支的时候,出现一个项目打不开了,提示:The project description file (.project) for XXX is missing 试了下网上的方法都没有解 ...

  3. DFT Architecture

    Design For Test 在实际生产过程中产生的physical defect是导致芯片功能出错的根本原因 如何根据结构产生测试向量呢?主要考虑physical defect physical ...

  4. 【ThreadX】Azure RTOS ThreadX概述

    Azure RTOS ThreadX是Microsoft的高级工业级实时操作系统(RTOS),专门用于深度嵌入式,实时和IoT应用程序.Azure RTOS ThreadX提供了高级计划,通信,同步, ...

  5. PHPCMS V9安装出现DNS解析失败的解决方法-不支持采集和保存远程图片

    目前因为phpcms官网停止解析后,很多人安装phpcms v9出现如下错误:     这是因为检测dns解析的域名是phpcms官网的域名,官网域名停止解析后肯定检测失败.解决方法如下:   打开/ ...

  6. [转帖]MySQL的版本情况

    Introducing MySQL Innovation and Long-Term Support (LTS) versions (oracle.com) Introducing MySQL Inn ...

  7. TiDB恢复部分表的方式方法

    TiDB恢复部分表的方式方法 背景 今天同事告知误删了部分表. 因为是UAT准生产的环境, 所以仅有每天晚上11点的备份处理. 同时告知 昨天的数据也可以. 得到认可后进行了 TiDB的单表备份恢复. ...

  8. [转帖]Sysbench - 一种系统性能benchmark

    SysBench是一款开源的.跨平台的.模块化的.多线程的性能测试工具,通过高负载地运行在数据库上,可以执行CPU/内存/线程/IO/数据库等方面的性能测试.用于评估操作系统的性能参数. 1 sysb ...

  9. ebpf 单行程序学习

    ebpf 单行程序学习 背景 公司方神借给我一本: <BPF之巅:洞悉linux系统和应用性能>纸质书 拿回家晚上在沙发上看了几天. 感觉书很厚看的不是很系统. 仅能凭自己的感觉总结一下这 ...

  10. 公司内部Oracle RAC测试环境的简单使用说明.

    1. 公司内部要测试Oracle RAC系统的创建与测试工作. 因为Oracle RAC 主要需要 多个网段以及共享存储, 直接使用ESXi搭建比较复杂 所以我这边使用vagrant的方式搭建Orac ...