清北学堂模拟day4 捡金币
【问题描述】
小空正在玩一个叫做捡金币的游戏。游戏在一个被划分成 n行 n列的网格状场地中进行。
每一个格子中都放着若干金币,并且金币的数量会随着时间而不断变化。 小空的任务就是在
网格中移动,拾取尽量多的金币。 并且,小空还有一个特殊技能“闪现”, 能帮助她在网格间
快速移动。
捡金币游戏的具体规则如下:在每一秒开始时,每个网格内都会出现一定数量的金币,
而之前在这格没有被拾取的金币就消失了。在游戏开始时,也就是第 1 秒的开始,小空可以
选择任意一个网格作为起点开始本次游戏,并拾取起点内的金币。之后,在下一秒到来前,
小空可以选择走路移动到与她所在的格子上、下、左、右相邻的一个格子中,或者呆在原地
不动,并在下一秒开始时拾取到她所在的格子中的金币。或者,小空可以选择使用闪现技能,
使用一次闪现时,她先选择上、下、左、右一个方向,之后向该方向移动两格。小空可以在
一秒内使用多次闪现,但不能超过 C 次。在一秒内使用的多次闪现必须向同一个方向移动,
若使用 x 次闪现,便可以向一个方向移动正好 2x 格,并且她也只能在下一秒开始时收集到
连续闪现结束后所在的那一格中的金币。如果在某一秒钟小空使用了闪现,那么她就不能选
择通过走路移动了,反过来也是如此。无论走路或者使用闪现,小空都不能移动到整个场地
之外。整个游戏共进行 T 秒,在第 T 秒开始时,小空将会拾取她所在的格子中的金币,并结
束游戏。 小空在整局游戏内一共只能使用最多 W 次闪现。
现在,给出游戏场地的大小 n,每秒钟开始时各个位置会出现的金币数,小空一秒内最
多使用闪现的次数 C, 小空在整局游戏中使用闪现的最多次数 W,整局游戏的总时间 T,请
你告诉小空她最多可以获得多少枚金币。
【输入】
输入的第 1 行包含 4 个整数 n, C, W, T,意义如问题描述中所述。
接下来包含 n 个 n*n 的矩阵,第 k 个矩阵的第 i 行第 j 列表示第 i 行第 j 列的格子在第 k
秒开始时出现的金币数( 记作si,j,k)。 相邻两个矩阵间用一个空行隔开。
【 输出】
输出包含一个整数,表示游戏结束时小空最多可以获得的金币数量。
【输入输出样例 1】
| coin.in | coin.out |
| 3 1 1 3 1 3 4 3 2 1 1 3 2 2 3 1 1 3 2 2 1 4 3 3 1 3 2 1 2 3 1 |
11 |
见选手目录下的 coin / coin1.in 与 coin / coin1.out
【输入输出样例 1 说明】
选择在第 1 行第 3 列开始游戏, 获得 4 枚金币;在第 2 秒开始时向下闪现到第 3 行第 3
列, 获得 4 枚金币;在第 3 秒开始时向左走到第 3 行第 2 列,获得 3 枚金币, 游戏结束。一
共获得 11 枚金币。
【输入输出样例 2】
见选手目录下的 coin / coin2.in 与 coin / coin2.out
【数据规模与约定】
| 测试点编号 | n | C | W | T | si,j,k |
| 1 | ≤5 | ≤2 | ≤4 | ≤5 | ≤1,000 |
| 2 | |||||
| 3 | |||||
| 4 | ≤21 | ≤10 | ≤80 | ≤80 | |
| 5 | |||||
| 6 | |||||
| 7 | ≤25 | =100 | ≤150 | ≤100 | |
| 8 | |||||
| 9 | ≤12 | ||||
| 10 |
对 100%的数据, n≥1, C≥0, W≥0, T≥1, si,j,k≥0
/*
方程并不难,主要通过这个题学一下单调队列
*/
#include <cstdio>
#define inf 1000000007
int a[][][],f[][][][],q[],qc[],v[][],cnt,n,C,W,T,i,j,k,t,ii,jj,kk,tt,l,r,
ans,ch,tag; void read(int &x)
{
for (ch=getchar(); ch<=; ch=getchar());
for (x=; ch>; ch=getchar()) x = x*+ch-;
} void update(int &x, int y)
{
if (y > x) x = y;
} void clear()
{
l=; r=;
q[] = inf;
q[] = -inf;
cnt = ;
} void push(int x)
{
q[++r] = x;
qc[r] = ;
q[r+] = -inf;
while (q[r] >= q[r-])
{
qc[r-] += qc[r];
q[r-] = q[r];
q[r--] = -inf;
}
if (++cnt > C) if (--qc[l] == ) q[l++] = inf;
} int main()
{
freopen("coin.in", "r", stdin);
freopen("coin.out", "w", stdout);
scanf("%d%d%d%d", &n, &C, &W, &T);
for (t=; t<=T; ++t)
for (i=; i<=n; ++i)
for (j=; j<=n; ++j) read(a[t][i][j]);
for (i=; i<=n; ++i)
for (j=; j<=n; ++j) f[][i][j][] = a[][i][j];
t = ;
for (tt=; tt<=T; ++tt)
{
t ^= ;
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k) f[t][i][j][k] = -inf;
for (i=; i<=n; ++i)
{
++tag;
for (jj=; jj<=n; ++jj)
for (kk=; kk<=W; ++kk)
if (v[jj][kk] != tag)
{
clear();
j = jj;
k = kk;
while (j<=n && k<=W)
{
v[j][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
j += ;
k++;
}
}
++tag;
for (jj=n; jj>=; --jj)
for (kk=; kk<=W; ++kk)
if (v[jj][kk] != tag)
{
clear();
j = jj;
k = kk;
while (j>= && k<=W)
{
v[j][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
j -= ;
k++;
}
}
}
for (j=; j<=n; ++j)
{
++tag;
for (ii=; ii<=n; ++ii)
for (kk=; kk<=W; ++kk)
if (v[ii][kk] != tag)
{
clear();
i = ii;
k = kk;
while (i<=n && k<=W)
{
v[i][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
i += ;
k++;
}
}
++tag;
for (ii=n; ii>=; --ii)
for (kk=; kk<=W; ++kk)
if (v[ii][kk] != tag)
{
clear();
i = ii;
k = kk;
while (i>= && k<=W)
{
v[i][k] = tag;
update(f[t][i][j][k], q[l]);
push(f[t^][i][j][k]);
i -= ;
k++;
}
}
}
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k)
{
update(f[t][i][j][k], f[t^][i-][j][k]);
update(f[t][i][j][k], f[t^][i+][j][k]);
update(f[t][i][j][k], f[t^][i][j-][k]);
update(f[t][i][j][k], f[t^][i][j+][k]);
update(f[t][i][j][k], f[t^][i][j][k]);
f[t][i][j][k] += a[tt][i][j];
}
}
for (i=; i<=n; ++i)
for (j=; j<=n; ++j)
for (k=; k<=W; ++k) update(ans, f[t][i][j][k]);
printf("%d\n", ans);
return ;
}
清北学堂模拟day4 捡金币的更多相关文章
- 清北学堂模拟day4 传球接力
[问题描述]n 个小朋友在玩传球. 小朋友们用 1 到 n 的正整数编号. 每个小朋友有一个固定的传球对象,第 i 个小朋友在接到球后会将球传给第 ai个小朋友, 并且第 i 个小朋友与第 ai个小朋 ...
- 清北学堂模拟day4 业务办理
[问题描述]在银行柜台前,有 n 个顾客排队办理业务. 队伍中从前往后,第 i 位顾客办理业务需要ti 分钟时间. 一位顾客的等待时间定义为:队伍中在他之前的所有顾客和他自己的办理业务时间的总和.第 ...
- 清北学堂模拟赛day7 数字碰撞
/* clj:水题别人都满分你不是你就完了,所以说水题一定要细心一点,有这么几个细节:①前导零的处理,全是零的时候要特判②换行要注意,不要多大一行,剩下就是水水的模拟了 */ #include< ...
- 清北学堂模拟赛d4t1 a
分析:大模拟,没什么好说的.我在考场上犯了一个超级低级的错误:while (scanf("%s",s + 1)),导致了死循环,血的教训啊,以后要记住了. /* 1.没有发生改变, ...
- 清北学堂模拟赛day7 错排问题
/* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...
- 清北学堂模拟赛day7 石子合并加强版
/* 注意到合并三堆需要枚举两个端点,其实可以开一个数组记录合并两堆的结果,标程好像用了一个神奇的优化 */ #include<iostream> #include<cstdio&g ...
- 清北学堂模拟day6 兔子
[问题描述] 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子 ...
- 清北学堂模拟day6 圆桌游戏
[问题描述] 有一种圆桌游戏是这样进行的:n个人围着圆桌坐成一圈,按顺时针顺序依次标号为1号至n号.对1<i<n的i来说,i号的左边是i+1号,右边是i-1号.1号的右边是n号,n号的左边 ...
- 清北学堂模拟day6 花
[问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
随机推荐
- Scala Trait
Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...
- JS, Node.js, npm简介
序 听过JS,听过Node,也听过Node.js,还听过npm,然而并不是很清楚的知道都代表什么,这两天调接口,然后前端同学很忙,就自己把前端代码拿过来跑了,也趁机了解一下这几个概念,下边做个小的总结 ...
- 【Beta】Scrum01
Info 时间:2016.11.26 21:30 时长:10min 地点:大运村1号公寓5楼楼道 类型:日常Scrum会议 NXT:2016.11.28 21:30 Task Report Name ...
- python标准模块(二)
本文会涉及到的模块: json.pickle urllib.Requests xml.etree configparser shutil.zipfile.tarfile 1. json & p ...
- jQuery知识点总结(第二天)
今天继续从我的笔记上面搬运.我们不产生知识,只是知识的搬运工. 内容过滤选择器: ○ 内容选择过滤器 $("div ...
- 设计模式-14 MVC模式
一 MVC设计模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式,它是一个存在于服务器 表达层的模型,它将应用分开,改变应用之间的高度耦合 MVC设计模式将 ...
- spark操作geoip的domain数据库
val ipv4 = sc.textFile("hdfs://hbase11:9000/sparkTsData/GeoIP2-Domain-Blocks-IPv4.csv").ma ...
- BIOS设置第一启动项
在电脑的Bois中怎样去设置第一启动项.. 对于很多新手朋友来说,BIOS满屏英文,生涩难懂,话说我原来也很排斥BIOS,界面太丑,光看界面就没什么兴趣,更谈不上深入研究,大多数人在电脑城装机的时候都 ...
- C#--中实现邮件发送
MailMessage mailmessage = new MailMessage(); mailmessage.To.Add("接受邮箱");//可以添加多个接收邮箱 mailm ...
- Ubuntu terminal 不见了
Python出问题了,卸载Python后,terminal竟然消失了.. Ctrl + Alt + T出现的是XTerm 解决办法: 在XTerm中输入命令: # sudo apt-get insta ...