8:20发的题,11:10分左右交卷

一开始有个巡考的还过来提醒我们「前15分钟建议只看题不要写题」,忍不住于是就开始写了

哇电脑屏幕好大,哇系统好流畅,哇键盘巨难用
题目发下来一看

  • T1看起来是个模拟?但是也许还有什么满分算法?算了先打暴力吧
  • T2是个字符串,貌似暴搜就能过的数据?暴力调了好久都没调出来,花了10分钟重新研究了一下被我忘的差不多的string的函数,用.find()写出来了
  • T3什么玩意啊,看见sigma就害怕,好可怕我得走.jpg
  • T4貌似是个线段树?啊不对这是区间加等差数列?最后还给了快读的函数?卡常?好可怕我得走.jpg x2

T1八种情况一开始只写出来六种,调了半个小时orz 期望得分100
T2一开始想写循环嵌套的暴力,怎么调都调不出来,最后换.find(),找到一个字串就销毁一个直到没有为止期望得分100
T3想了一下写了个O(n^4)然后用前缀和优化了一下中间的求和部分,n从150跑到了225 期望得分30
T4实在想不出正解,推了一下等差的式子就上暴力了期望得分20


成绩出来了,从100+100+30+20掉到了100+20+0+30
t2读错了一个题目条件,从rank36掉到rank77
再见了我去考小学省赛了

T1 扫雷游戏 game 1s/256mb

根据题意模拟8个位置即可

#include <bits/stdc++.h>

char G[101][101];

int main () {
    freopen("game.in", "r", stdin);
    freopen("game.out", "w", stdout);
    
    register int i, j;
    int n, m, cnt = 0;
    
    std::cin >> n >> m;
    for (i = 1; i <= n; ++ i) {
        for (j = 1; j <= m; ++ j) {
            std::cin >> G[i][j]; 
        }
    }
    
    for (i = 1; i <= n; ++ i) {
        for (j = 1; j <= m; ++ j) {
            if (G[i][j] == '#') {
                std::cout << "#";
                continue;
            }
            if (G[i][j] == '?') {
                cnt = 0;
                if (G[i - 1][j] == '#') ++ cnt;
                if (G[i - 1][j - 1] == '#') ++ cnt;
                if (G[i][j - 1] == '#') ++ cnt;
                if (G[i][j + 1] == '#') ++ cnt;
                if (G[i + 1][j] == '#') ++ cnt;
                if (G[i + 1][j + 1] == '#') ++ cnt;
                if (G[i + 1][j - 1] == '#') ++ cnt;
                if (G[i - 1][j + 1] == '#') ++ cnt;
                std::cout << cnt;
            }
            
        }
        std::cout << "\n";
    }
    
    return 0;
}

T2 音乐 music 1s/256mb

用find函数一个个找字串,找到一个就在原字符串中销毁一个,然后计数

#include <bits/stdc++.h>

struct node {
    std::string s;
    int k;
} G[11];

int main () {
    freopen("music.in", "r", stdin);
    freopen("music.out", "w", stdout);
    
    register int i, j;

    int n, cnt = 0, tot = 0, k;
    std::string str;
    std::cin >> n;
    for (i = 1; i <= n; ++ i) {
        std::cin >> G[i].s >> G[i].k;
    }
    std::cin >> str;
    
    for (k = 1; k <= n; ++ k) {
        bool flag = true;
        std::string tmp = G[k].s;
        tot = 0;
        std::string TMP = str;
        while (1) {
            int x = TMP.find(tmp);
            if (x == TMP.npos) break;
            TMP[x] = ' ';
            ++ tot;
        }
        cnt += (tot*G[k].[k]);//考试的时候就是这一行写成了tot*tot
    }
    
    std::cout << cnt;
    
    return 0;
}

T3 最大子段和 sum 1s/256mb

分段求最大字段和,然后枚举分界点打擂台