2018年第九届蓝桥杯C/C++ B组国赛总结

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天假期也就结束了。

发表此文仅供总结回忆,如有大佬路过,本人菜鸡一枚,多多包涵勿喷。

猜你喜欢

转载自blog.csdn.net/daixinliangwyx/article/details/80526793