(Maple说我们回家一定抽机或者各种浪,反正改题/写总结什么的都是骗他的。现在就打他脸。233333)
嗯,一转眼就day7了呢。。week1就这么完结了?
今天来了一发test,然而lkb考的并不算好,也不算差。
四个小时的考试时间,四道题,最终0+71+0+70=141,rank13。
(yhf神犇0+100+50+10=160,rank8,orz。)
下面简要分析一下试题吧。
T1:平面上有
N
条直线,用方程
查了一下,如果没错的话这题应该是 coi 2013-2014 round 5 原题。
由于lkb只是初一的弱菜,所以并没有学过一次函数,所以并不懂这题怎么乱搞,所以并没有做,华丽爆零。
评讲的时候听了一下,按照Maple的说法,只要注意到组成三角形的三条直线其中任意两条不能互相平行,那么先求出斜率相同的直线(也就是互相平行的直线),然后组合数学乱搞一下就好。
药丸,到时候研究一下tmk的程序再看看吧。
T2:有
n
个不同的物品,它们的编号为
获得一个物品有两种方式:
- 直接购买该物品,第
i
件物品花费的钱为
ci - 用两件其他物品合成所需的物品,一共有 m 种合成方式。
求最少用多少钱能获得编号为
这题应该是2014年中山市选T2原题。
这题可以用类似spfa的bfs+迭代或者类似dijkstra的不断优化搞。
- 如果用前一种方法,那么具体的实现就是:先把第
2
至
n 个点入队,每次取队首元素 i ,看它能改进谁,对于每一个能被(i,j) 改进的 k ,如果满足ci+cj<ck ,那么更新 ck ,并把 k 入队,直至队列为空为止。最后c1 就是答案。 - 如果用后一种方法,那么具体的实现就是:每次取花费最小的物品
i
,易知它已经无法被改进(这是显然的),那么就直接用它去尝试改进别的物品,直到无法改进为止。此时算法结束,
c1 就是答案。
这两种算法都可以过,但是考试的时候lkb并没有想出正解,只打了个记忆化搜索:
- 定义
f(k)
为物品
i
的最小花费,则解为
f(1) - 对于每一对能改进
k
的
(i,j) ,递归求解 f(i) 和 f(j) ,那么就有 f(k)=min{ck,min{f(i)+f(j)}} - 求得 f(k) 的解后保存起来,当再次求解时可直接取之前保存的值
但是容易举出反例说明这种做法是错误的,并且时间复杂度比较高,有超时的风险。
不过最终lkb凭借这个奇怪的搜索居然骗到了71分,然而其实正解并不难实现。
T3:对于字符串
S
的前
此题是 noi 2014 day2 原题。
我们来分析一下暴力的做法:枚举
i
,对于每一个
理论上这种算法应该可以通过30%的测试数据,但是lkb居然诡异的爆零了。zzr说,应该是没有开long long。于是lkb试着把
30分了。
Excuse me???
真的被自己蠢哭了哎。
下面说一下正解吧,现在知道的有两种解法:
- 考虑简化问题,去除“该后缀与该前缀不重叠”的限制后,问题变成了一个简单的 DP —— numi=numnexti+1 。考虑限制条件 —— 我们需要对 next 数组设置同样的限制条件,并设其为 next2 。然后对于带限制的 num (设为 num2 ),发现 num2i=num2next2i+1 并不成立,观察后可发现 num2i=numnext2i+1 。(然而lkb其实并不会,这是借(chāo)鉴(xí)神犇blog的。)
- 还有一种ex_kmp的做法,然而lkb并没有听懂。
T4:有
n
个男孩、
这题是hdu3121。
是的,这题的数据范围看似比较小,
不过其实正解是最大流。不过其实lkb不会正解。233
这次考试发挥的一般,虽然骗到了点分,不过应该拿到的T2居然爆零了,这就很tm尴尬了。只能说毕竟还是too young,不过以后要避免了。
之后的夏令营,剩下的几天好好加油吧。嗯,不能再颓了。