151013的测试总结
- T1
- T2
- T3
- 最后的总结
T1
Dp && Gcd
【题目及题号】农夫过河 superoj923
【第一次】87.5 wa掉一个点
【题解】
本题有一个性质:在lcm(a[1]+b[1],a[2]+b[2],……,a[n]+b[n])的时间内必定出解,如果没有找到解就为IMPOSSIBLE。
发现1~10的lcm最大为2050然后就可以开开心心写暴力dp了。
f[i][j]表示到第i个桩子,时间为j是否可行。
f[i][j]可以由f[i-1~5][j-1]和f[i+1~5][j-1]转移而来。
【考试ING】
每次dp都有可能扩大解的范围,所以dp可以多跑几遍QAQ我只跑了一遍Orz。
其实我是怕T。
QJC说可以从左边跑到右边,再从右边跑到左边,再从左边跑到右边(双向转移就一定不会错)。
“没证明过,也许可以保证无后效性。谁知道呢。Orz”
【错因】
只跑了一遍dp。下次算清楚时间复杂度,然后别怕T。我们不怂。
T2
DP && 状态压缩 && Floyd(最短路)&& BFS
【题目及题号】掘金 superoj924
【第一次】暴力10分(题目没给详细的数据范围,我猜是uva的题)
【题解】
本题考的知识点比较杂:dp+状态压缩+floyd+bfs。
定义‘G’‘E’‘X’代表的为点,‘-’代表路径。
先用bfs搜出m步以内,点之间直接到达的距离(不经过其他点);
然后用floyd算出所有点之间的最短路【可以经过其他点】;
最后对于第一问判断有多少个点可以由起点到达。
对于第二问就分别DP(记忆化搜索)
f[i][j]表示当前停在第i个’G’状态为j;j表示哪些‘G’已经到过了;
最后找一找f[i][j]中j转二进制有多少个1,数量和第一问相同的情况下再更新第二问的最小值。
具体来说就是ansb = min(ansb,f[i][j]+dis[i][ed]);ed是‘X’所在点。
【考试ING】
上来其实没怎么想这道题,直接写的暴力,然而这道题的暴力写的我都快哭了。
归纳一下:
此题提供了一个思路:如果搜索无法保证最基本的剪枝就把它转成区间最优值,然后再来限定条件搜。
具体来说就是这道题的暴力写深搜根本无法确定到当前步数最短一定最优或者走过的不能再走;
走过可以再走的话那么就按这种方式把它转成区间最优来搜状压。
【错因】
自己下来写完之后发现数组开小了,交上去报错为WA,不是RE。手玩儿大数据看出来的错啊,一把泪。
下次注意:即使每次都记得把数组开大一些,交卷之前除了文件名还是要重新看一遍数据范围,算一算数组大小。
本题其实是用电脑自带计算器算的时候按错了,可能是鼠标点1没点上,然后没注意到屏幕直接按了ENTER看结果。
╮(╯▽╰)╭唉!
T3
KMP(略有改动)
【题目及题号】 动物园 superoj848
【第一次】50%A 50%T
【题解】
这道题用kmp做,线性的做法大概如下:
利用kmp的性质,可得知如果当前字母的next指字母i,设前i个字母的长度为len。
那么以当前字母为结尾且长度为len的字符串和以i为结尾的前缀是完全相同的。
那么记录当前点最少跳多少次到空,就是最少的包含次数。
然后本题要求不重合,那么只匹配一半即可。
具体见代码【复习的时候记得去bzoj看】。
void work()
{
next[0] = -1;
for(int i=1;i<len;i++){
ll now = next[i-1];
for(;s[now+1]!=s[i] && now!=-1;now=next[now]);
next[i] = ((s[now+1]==s[i]) ? now+1 : -1);
if(next[i]!=-1) num[i]=num[next[i]]+1;
}
int ed,j=-1,m=0,ck=0;
ans = 1;
for(ed=0;ed<len;ed++){
if(ed&1) ss[m]=s[m],m++;
for(;j!=-1 && ss[j+1]!=s[ed];j=next[j]);
if(ss[j+1]==s[ed]) j++;
if(j!=-1) ck = 1;
else ck = 0;
ans = (ans*(ll)(1ll*num[j]+1ll+ck))%mod;
}
cout<<ans<<endl;
}
【考试ING】
先写了个O(n^3)的暴力,然后想了想又写了个O(n^2)的暴力,看看时间还有二十分钟,啊不想了反正写不完了。
开开心心去对拍Orz。
本题给我的教训:题目当中提到的算法虽然不一定要考,但是如果详细解释了的话,它说不定就是标算的一部分。
出题人的心思你别猜Orz。
表格
成绩记录:
题目 | 期望分数 | 实际得分 |
---|---|---|
River | 100 | 87.5 |
Gold | 30 | 10 |
Zoo | 50 | 50 |
最后的总结
这次仍然不是第一Orz,傻逼的我不应该在最后一秒改代码。如果不改就a第一题。如果160开开心心踩第一,结果手残。事实上还是因为自己考虑不太周全,只能继续加油啦↖(^ω^)↗