2018年4月1日蓝桥杯省赛,在结果填空只对两个的情况下,靠着大题,一不小心就进了国赛,心里还是有点小意外的,毕竟第一次参加蓝桥杯。也算对得起省赛前一个多月那么认真熬过来了吧。5月26日国赛,在一个多月的备考时间里,把原本打算好好学的python和网页也都放下了,继续在c/c++题海里面混来混去。
请了5天的假,5月24日下午两点半的火车,坐了20个小时,25日到了北京。25日下午先去首都经济贸易大学看好了考场,然后因为也比较晚了,只能和同学去南锣鼓巷、后海那边转了转。(ps:中午吃了顿好的,北京经典烤鸭78元半只真心贵,而且,真心吃不惯享受不来北方人眼中的美味)。26日上午倒是好好复习了一上午也没出去玩,午饭都是在酒店里面随便吃点零食凑合过去了。然后一点多点就去考场了。
考场发放纸笔(笔为决赛纪念笔可以带走)、一瓶水水、一盒牛奶、一个面包。全程思考想多做点争取拿奖,也就没时间喝牛奶吃面包了。看到题目,第一题很简单,两层for循环直接解决。第二题,30个灯开关灯的,也没多想有没有更简单的方法,反正也就是个结果题,于是乎很佛系的写了30层for循环,每层for遍历0跟1模拟开关灯。第三题是位运算来得到格雷码的代码填空题,做了一会,没头绪也蒙了好久,都没试出来,就放弃了。看第一个大题感觉要想一会就先跳过了,第二个大题感觉蛮难也跳过了,看到第三个大题,挺高兴的,可以暴力水一点分,果断立马写上暴力代码,又尝试突破一下更好的方法,失败了没想出来。就回去做第一个大题了,想了一会,也就是个模拟,代码如下:
#include<stdio.h> #include<string.h> #include<set> using namespace std; int main() { int n, k, i, sum = 1, a[100005], t; memset(a, 0, sizeof(a)); a[0] = 1;//起点 scanf("%d%d", &n, &k); for(i = 1; i <= n; i++) { set<int> s; for(int j = 0; j < n; j++) { if(a[j]) { t = j + 1; if(t >= n) t = (t - n) % n; if(!a[t]) s.insert(t); t = j + k; if(t >= n) t = (t - n) % n; if(!a[t]) s.insert(t); } } sum += s.size(); set<int>::iterator iter; for(iter = s.begin(); iter != s.end(); iter++) a[*iter] = 1; if(sum >= n) break; } printf("%d\n", i); return 0; }
然后就使劲钻第二个大题了,想了好久,也没想到好的办法,于是就先写个模拟的方法暴力拿点分喽。写写改改的,只剩下半个多小时的时候,就倒回去检查前面做了的题目,重点看了下我那30层for循环,还真被我看到了有个变量重复了,及时改回来了,就没导致简单题丢分。最后还有5分钟的时候,总算是把第二个大题模拟完了,感觉能过部分数据拿点分,也挺开心的,凭着记忆回忆了一下,依稀记得是这样写的:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int n, m; char Map[1005][1005], s[1005][1005]; int a[1005]; struct point { int x, y; }p[1000005]; int check() { for(int i = 1; i <= n; i++) { int t = 0, p; for(int j = 1; j <= m; j++) if(s[i][j] == 'o') { if(s[i+1][j] == '.') return 0; p = j; t++; } if(t > 1) { for(int j = t; j >= 0; j--) if(s[i][j-1] != 'o') return 0; } } return 1; } int main() { memset(p, 0, sizeof(p)); long long sum = 1, tot = 0; scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { getchar(); for(int j = 1; j <= m; j++) scanf("%c", &Map[i][j]); } for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) if(Map[i][j] == '.' && Map[i+1][j] != '*') { p[tot].x = i; p[tot].y = j; tot++; } for(int i = 1; i <= tot; i++) {//摆放多少个点 memset(a, 0, sizeof(a)); for(int j = tot-1; j >= tot-i; j--) a[j] = 1; do { for(int ii = 1; ii <= n; ii++) for(int jj = 1; jj <= m; jj++) s[ii][jj] = Map[ii][jj]; for(int ii = 0; ii < tot; ii++) if(a[ii]) s[p[ii].x][p[ii].y] = 'o'; if(check()) sum++; }while(next_permutation(a, 点a+tot)); } printf("%lld\n", sum); return 0; }
差不多就这样,做了5个题目,加起来应该对了4个的样子。
考完就去找我表哥玩了,去了鸟巢、水立方。还买了180一人的票进鸟巢里面看灯光秀和京剧,灯光秀就是鸟巢的灯光打在田径场上,我感觉一般般,音响倒是很不错。京剧就是个鸡肋了,我的是vip票,坐在最前排的方桌那里看,原来就是一两个人对着屏幕上的动画人对唱,连真人敲鼓的都没有,配乐全靠动画。看了十几分钟挨不住饿也实在看不下去了就出去了。鸟巢边上吃东西的地方好少,还贼贵,在那吃个小小的一碗酸辣粉26元,一个肉夹馍16元,味道也是一般般。27号呢,就先去看了下希格玛大厦,然后去了北航,看了下里面的航天航空博物馆。转而去清华,跑了两个门都不让进,非得去南门才让进。在这中途,成绩也出来了,二等奖,也挺意外的,比较满意吧,果然是暴力杯,全程暴力也拿了国二哈哈哈哈。吃了顿好的午饭,同学说不想去清华了,于是就去北大,戏剧性的是,我跟着北大学生混进去了,我同学被拦下来了。于是我妈兵分两路,我在北大里逛,他去了国家图书馆。再后面就去颐和园,但是竟然要门票,失算了,就没进去,直接去天安门了。逛完天安门就回酒店了,然后去北京西站坐火车。
28日早上7点半到了南昌,同学和带队老师先回宜春去了,我一个人留在南昌去看猪吃猪,哈哈哈哈哈哈哈。晚上还坐了摩天轮,南昌之星摩天轮的确挺好看的,也高,但是转动速度也太慢了吧,转一圈就用了半小时,没啥刺激的,不过这速度也把某猪吓得一动不动哈哈哈。然后买的晚上9点25的高铁,坐公交到南昌西站了就是狂奔,差点没赶到。11点多到学校寝室,5天假期也就结束了。
发表此文仅供总结回忆,如有大佬路过,本人菜鸡一枚,多多包涵勿喷。