最近一周学习了紫书第七章暴力求解法。只学到了一半吧,进度不算快,但我还是很有收获的。现在我还在尝试平衡文化课学习与oi学习,我不敢一直学oi荒废了文化课,也更不愿意减少对oi的投入。这一周学习oi的时间主要是政治、地理上课时间以及其他同学课间上厕所或者玩闹的时间,毕竟我高二会选理科,地理不学每次都考高分(不知为啥),政治完全不会,放弃了,但是我不敢用自习时间学习oi,其他同学在学习,我不学,凭什么月考比他们高?
这一周后三天坚持凌晨一点左右睡觉,第二天基本上可以保持精神饱满,就是感到身体老是发生一些小问题,比如突然耳鸣,血压感到不太对劲。再试几天吧,如果症状加深立即停止熬夜,如果消除了就继续坚持。
竞赛上的话,基本上每天可以过一到两个例题的,但是7-5花了两天时间。我总结了一下原因,用学长的话说,就是太浮躁了。题目没有吃透,就一直想自己打出来,结果不是判断条件写错就是那个变量写的不对。这一周还发现一个问题,就是因为除去非算法原因的错误所花的时间太多了,比如一个小时之前做的题目困难的串,自己写了出来,结果debug花了很长时间,大约40分钟吧。最后发现的问题一是上边说的问题,我认真思考了我的程序,解决了算法上的问题,但总是不输出结果。这困扰了我很长时间,我对着书中的例句一句一句的对照也没发现错误。最后发现了错误原因,如下:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int cnt,S[100],n,L; 5 6 int dfs(int cur) 7 { 8 if(cnt++==n) 9 { 10 for(int i=0;i<cur;i++)printf("%c",‘A‘+S[i]); 11 printf("\n"); 12 return 0; 13 } 14 for(int i=0;i<L;i++) 15 { 16 int ok=1; 17 S[cur]==i; 18 for(int j=1;j*2<=cur+1;j++) 19 { 20 int equal=1; 21 for(int k=0;k<j;k++) 22 if(S[cur-k]!=S[cur-k-j]){equal=0;break;} 23 if(equal){ok=0;break;} 24 } 25 if(ok) 26 if(!dfs(cur+1))return 0; 27 } 28 } 29 30 int main() 31 { 32 cin>>n>>L; 33 dfs(0); 34 }
第17行的S[cur]=i写成了S[cur]==1,为什么会出现这个问题呢?我想可能是因为写程序是心不静吧,还有就是题目练得还是太少。最近上机时总是出现这种问题,还需要多刷题目啊。
今天晚上看看第七章其余部分,如果看懂了就认真理透,实在看不懂就开始刷题吧,洛谷vijos都可以。周日下午要继续刷题,下周一边刷题一边看看第八章例题。