第一次笔试(2025-08-09)

编程题

#include <bits/stdc++.h>  // 一次性包含几乎所有C++标准库(竞赛常用)
using namespace std;

int main() {
    ios::sync_with_stdio(false); // 关闭C和C++标准流的同步,加快cin/cout速度
    cin.tie(nullptr);            // 解除cin和cout的绑定,防止每次cin前强制刷新cout

    int n;
    // 如果无法成功读入n(例如输入结束EOF),直接退出程序
    if (!(cin >> n)) return 0;

    // a[i] 表示第i只怪兽的血条
    vector<long long> a(n + 1);
    for (int i = 1; i <= n; ++i) cin >> a[i];

    // NEG 表示“无效状态”,初始化时用这个值防止错误转移
    const long long NEG = LLONG_MIN / 4;

    // cur[t]   表示当前击杀数 mod 10 == t 时的最大经验值
    // nxt[t]   表示下一轮(处理完第i+1只怪后)的状态
    array<long long, 10> cur, nxt;

    // 初始化cur数组,全部设为无效值NEG
    for (int t = 0; t < 10; ++t) cur[t] = NEG;
    cur[0] = 0; // 处理0只怪时,击杀数mod10=0,经验为0

    // 枚举每一只怪兽
    for (int i = 0; i < n; ++i) {
        // 每次处理新怪兽前,清空下一轮状态
        for (int t = 0; t < 10; ++t) nxt[t] = NEG;

        // 枚举当前所有可能的击杀数mod10状态
        for (int t = 0; t < 10; ++t) {
            long long val = cur[t]; // 当前状态的最大经验值
            if (val == NEG) continue; // 无效状态跳过

            // 1) 放走第 i+1 只怪
            //   经验增加 (i+1),击杀数不变(mod10状态不变)
            nxt[t] = max(nxt[t], val + (i + 1));

            // 2) 击杀第 i+1 只怪
            //   经验增加 ((当前击杀数mod10) + 1) * a[i+1]
            //   击杀数mod10 状态更新为 (t+1) % 10
            long long gain = (t + 1) * a[i + 1];
            nxt[(t + 1) % 10] = max(nxt[(t + 1) % 10], val + gain);
        }

        // 更新当前状态
        cur = nxt;
    }

    // 最终答案是处理完n只怪后,所有可能的mod10状态中的最大值
    cout << *max_element(cur.begin(), cur.end()) << "\n";
    return 0;
}

第二题: