浙江工商大学2020年新生赛部分题解(二)

浙江工商大学2020年新生赛部分题解(一)
浙江工商大学2020年新生赛部分题解(三)

【本人的代码风格比较特殊,所以所有代码只提供了核心部分,不提供头文件、命名空间、main函数的部分,各位只需要参考逻辑即可】

站神与最简单的语言

吐槽

这题是我出的题
这道题的题面完全是从Wikipedia上复制粘贴过来的,我给个截图给大家比对一下
这是题面
题面
这是Wikipedia上的内容
Wikipedia
(是不是发现了一种全新的出题方式)
这道题当时被评定为倒数第二难的题(也就是除了防AK题中最难的那道题)

后台的数据其实也很简单,其实都是这个网站帮忙生成的,导致其实后台数据挺弱的

题解

回到题面,大致意思是让你实现一个BrainFuck语言的编译器
为了照顾新生,我特意去掉下面几种特殊的情况:

  • 存在死循环
  • 存在括号嵌套(新生可以考虑一下怎么做)
  • 不需要考虑输入
  • 不需要考虑括号是否合法

是不是突然感觉学长对你们还是很好的
然后为了加大一下难度(其实并没有),增加了一些特殊条件的判断

这道题最难的地方,我觉得应该是两点

  • 如何处理循环
  • 如何处理出现程序错误时的问题

由于没有括号的嵌套,我们只需要记录下上一个[所在的位置,当我们遇到]的时候,直接转跳到上一个保存的位置即可。因为括号的匹配必定合法

第二个问题,其实最方便的解法就是在输出错误信息后,使用exit(0);或者return 0;直接结束程序就行

最后实际交的代码数量也不多,也算是符合最难的题的预期

AC code

void solve() {
    
    
    vector<char> data(1, 0);
    int pos = 0;
    int cnt = 0;

    string str;
    cin >> str;

    int miss = 0;
    for (int i = 0; i < str.size(); ++i) {
    
    
        if (miss == -1) {
    
    
            if (str[i] == ']') miss = 0;
            continue;
        }
        if (cnt == 1000000) {
    
    
            cout << "Endless Code" << endl;
            return;
        }
        switch (str[i]) {
    
    
            case '>':
                pos++;
                if (data.size() == pos) data.push_back(0);
                break;
            case '<':
                if (pos == 0) {
    
    
                    cout << "Segment Fault" << endl;
                    return;
                }
                pos--;
                break;
            case '+':
                if (data[pos] == 127) {
    
    
                    cout << "Char Overflow" << endl;
                    return;
                }
                data[pos]++;
                break;
            case '-':
                if (data[pos] == 0) {
    
    
                    cout << "Char Overflow" << endl;
                    return;
                }
                data[pos]--;
                break;
            case '.':
                if ((data[pos] >= 32 && data[pos] <= 126) || data[pos] == 10) {
    
    
                    cout << data[pos];
                    break;
                } else {
    
    
                    cout << "Char Unknown" << endl;
                    return;
                }
            case '[':
                miss = data[pos] ? i : -1;
                break;
            case ']':
                i = miss - 1;
                break;
        }
        cnt++;
    }
}

站神与肃正协议

吐槽

这题不是我出的,真的不是我出的,这题是会长出的,锤他就行了
看了很多人的代码,其实大家都是能算出来2000这个分界点的,很多都是在一些小细节的地方没有处理好导致疯狂的WA

这道题当时在判断的时候,认为是倒数第二简单的题

题解

我们先看前两个舰队:“护卫舰”(下面简称A)和“战列舰”(下面简称B),我觉得能进入这个学校的应该都能理解下面这个原则吧……

当需要的战斗力 ≥ 50 \geq 50 50时,选择B,否则选择A

这个题面中有一个很有意思的东西,叫“泰坦”(下面简称C)
它能够使得整个舰队的战斗力翻倍,但是它的耗时也是非常长

我们考虑它的最优花费情况,也就是其他的都选B(毕竟B的价值比最大)。我们定义两个可能的组合

  • 选择了 x x x艘B
  • 选择了 y y y搜B,同时选择了一艘 A A A

我们可以列出等式,来比较一下什么时候前者方案更优,什么时候后者方案更优

{ 时 间 : 50 x = 500 + 50 y 战 斗 力 : 100 x = 200 y \begin{cases} 时间: 50x = 500 + 50y \\ 战斗力: 100x = 200y \end{cases} { :50x=500+50y:100x=200y

可以得到

{ x = 20 y = 10 \begin{cases} x = 20 \\ y = 10 \end{cases} { x=20y=10

也就是说,当战斗力超过 2000 2000 2000时,则使用C,否则不用C

但是,“泰坦”只能建造一艘(貌似有部分同学没有注意到这个)

所以题目还是比较简单的

AC code

void solve() {
    
    
    int n, ans = 0;
    cin >> n;
    if (n >= 2000) {
    
    
        ans += 500;
        n = (n + 1) / 2;
    }
    ans += n / 100 * 50 + (n % 100 >= 50 ? 50 : n % 100);
    cout << ans << endl;
}

吃米饭的站神

吐槽

这题怎么说呢
看完后台的代码我也不知道吐槽啥吧
为什么那么多人喜欢开长度只有99的数组……
99这个值……实在过于小了一些了吧
开数组的时候不要太害怕,直接开几百万的,只要不上亿,问题都不大
我们的题目明确说明了,数字个数有 2000 2000 2000个!数据范围是 1 e 9 − 2 e 9 1e9-2e9 1e92e9
所以有一大堆的RE

这道题在所有题中,是第四简单的题

题解

这道题最简单的解法,我觉得应该是这样

  • 遍历每一个数,将它减去 a a a
  • 用另外一个长度为 2000 2000 2000的数组作为标记数组
  • 将每个值放进标记数组中,将标记数组对应位置改为“真”
  • 遍历整个数组找唯一那个不为“真”的,输出即可

AC code

void solve() {
    
    
    int n, a;
    cin >> n >> a;
    vector<bool> data(n + 1, false);
    for (int i = 0; i < n - 1; ++i) {
    
    
        int tmp;
        cin >> tmp;
        data[tmp - a] = true;
    }
    for (int i = 1; i <= n; ++i)
        if (!data[i]) {
    
    
            cout << i << endl;
            break;
        }
}

猜你喜欢

转载自blog.csdn.net/m0_43448982/article/details/111460449