7.8总结

7.8总结

前言

首先,关于新评测机:

它死了

状态那里积了15页的pending

得分情况

估分:0+100+50=150

实际:0+100+19=119

Rank12

T1签到题没做出来,凉凉

T1

题目大意

除去对铁质盔甲强烈的热爱,Brunhilda是一个正常的7岁女孩。近期,她正在策划一个完美的生日派对。她发明了如下的一个游戏:所有的孩子在一个数k被宣读之前不停地跑来跑去。当这个数字k宣读后,所有的孩子将形成人数恰好为k的若干群体,且保证剩余的孩子数目小于k。最后,这不足k个的孩子将从游戏中被淘汰。紧接着,比赛将继续进行,并公布一个新的数字k。游戏将在所有的孩子都被淘汰后结束。

Brunhilda请她的父亲Wotan在游戏中来宣读数字。Wotan不喜欢这个游戏,当然也不希望在游戏的第一轮就宣布一个正无穷(PS:宣布正无穷等于将所有的孩子都从游戏中淘汰)。 Brunhilda认为这在派对上是相当尴尬的情形,所以她给了她父亲一串共计m个素数的列表。这样,她的父亲便可以从中进行选择。当然,相同的数字在游戏中可以被多次宣读。

Wotan想尽快结束比赛,因为他有一张他最喜欢的足球俱乐部 FC Asgard的比赛门票。不幸的是,Brunhilda不知道派对上参加游戏的孩子数目。现在,对于Q个不同的数n1,...,nQ个儿童,Wotan要预先知道他所需宣读的最少数字,以便他尽早结束游戏。

20%的数据:m,nj,Q<=10000.

另有20%的数据:Q=1

100%的数据:1<=m,Q<=100 000,1<=nj<=10 000 000,2<=pi<=10 000 000

比赛时没注意到前20%nj<=10000,没打暴力,丢了20分

正解:

对于20分的dp,我们有方程f[i]=min(f[i-i%p[j]])

观察到f是单调不下降的,f[i]>=f[j]|(i>j),因为如果f[i+1]<f[i],则更新i+1的点一定可以更新到i,矛盾。

设p为k的质因子(p是题目中给定的一个质数),f[k]—>f[k+1~k+p-1]

现在只要找出每个数的最大的,题目给定的质因数(设为ma[k])就能枚举k,把能转移到的区间往后更新,O(n)转移了

设k=a*b,ma[k]=max(ma[a],ma[b]),ma[pi]=pi

类似筛法搞搞就行

T2

题目大意

森林里有一片长方形的草地,在清晨的大雪过后被一层厚厚的积雪所掩盖(下图左)。

住在森林里的兔子和狐狸,穿越草地,都会在雪地上留下他们的踪迹。他们总是从左上角进入,并从右下角离开草地。在这两者之间,他们可以来回走动,在雪地里玩,甚至在同一个地方多次留下踪迹。在任何时候,最多只有一只动物在草地上,且所有的动物都只进入草地一次。这些动物的运动踪迹可以被简单的利用横纵坐标来描述。它们不会斜着走,也不会跳越一个单元格。当新的动物进入单元格,旧的足迹都将被新的足迹所覆盖。
你将在一段时间后,得到一张描述草地上每个单元格的状态的地图。请写一个程序,计算可能出现的动物数目的最小值N。

30%的数据满足:动物数N<=200,H,W<=500

100%的数据满足:1<=H,W<=4000

签到题。

现在在(1,1)的动物一定是最后走的,为了使答案最小,我们像细胞那样, 把相邻的同种动物的脚印都标记上。同时记录相邻的另一种动物的脚印,下次从那些脚印扩展就好了。

T3

Victor 正在使用 vim 编辑他的文章,他的文章只包含 abcdefghij 这 个字母,他想把他文章中所有的 e 都删除。Victor 并不是很熟悉 vim,它只懂得下面几个操作:

  • x:删除光标所在的字母,光标位置不变。
  • h:光标向左移。如果已经是行首就不会移。
  • f:后面还会跟一个字母 c,表示跳到下一个字母 c 的位置。如果不存在那么就不会跳。

悲剧的是 Victor 的键盘上 e 按键突然坏掉了……请问:Victor 最少需要按多少个键才能把所有的 e 删除。

例如,如果当前的文本是 jeff[i]ehadabigidea,则

  • x 操作后文本将变为 jeff[e]hadabigidea
  • h 操作后文本将变为 jef[f]iehadabigidea
  • fi 操作后文本将变为 jeffiehadab[i]gidea

想打50分dp,结果打挂了只有19分,死活调不出来

现在调出来了。O(\(n^3*10\))要吸氧才能拿48分

正解

线头dp??!

有这四篇题解写的很好

LOJ2687 BalticOI2013 Vim 线头DP

动态规划4——从两题来看线头DP的基本应用

【LOJ#2687】Vim(动态规划)

jzoj3320vim题解—“线头”dp.pptx By严禹韬

下面是我自己的理解:

线头dp就是找出一些关键点,每个关键点有一些线头,通过连接这些线头来计算答案

听起来就超级抽象

对于这一道题,一段连续的‘e’之后的那个字符是必须经过的,所以它们就是关键点。

答案就是经过这些关键点的路径长加上‘e’的个数*2。

设f[i][j]表示当前在i位置,并且i,i+1之间的这条线段被覆盖的次数为1次的接下来要跳到j字母的最小代价。设g[i][j][k]表示当前在i位置,i,i+1要覆盖三次,因为被覆盖三次所以会有两次向后跳的操作,第一次跳到了j字符,第二次跳到了k字符的最小代价。注意到这个状态中,并不代表着是从i位置往后跳j,而是从i位置之前的某个位置到达i之后j字符的最小代价。

事实上,f和g的代价只计算了1~i的点向后跳的代价以及1~i+1的点往回走的代价

转移参考上面的博客。

初始化f[0][s[1]]=0

假设我们的字符集a~j编号为0~9,那么我们将10视为一个没出现过的字符,最后dp出的ans就是f[n][10]-2
因为10不存在,所以可以把f[n][10]视作将绳子拉向一个无限远的点
又因为这样代价为2,而实际上我们并不需要这样做,所以减去2

感受一下就好了,估计以后也挺难遇到的

花絮

  1. 古爷拿金牌回来啦!
  2. 新OJ叫GMOJ,Gold Medal Online Judge金牌OJ
上一篇:杭电1003题


下一篇:树形dp