1 solutions

  • 0
    @ 2025-6-10 21:31:53

    维护几个状态

    • cur_monster:当前攻击的怪物索引(从0开始)。

    • current_hp:当前怪物的剩余血量(初始为第一只怪物的血量)。

    • att:当前攻击力(初始为1)。

    • ans:记录每只怪物的击败时间。

    • 对每个操作(按序号1到m),根据类型更新状态:

      • 操作1:扣除当前攻击力,若怪物血量≤0则记录时间,切换怪物并重置攻击力。
      • 操作2:攻击力+1。
      • 操作3:跳过。
    • 初始化时,current_hp为第一只怪物的血量,cur_monster为0。

    • 每次操作1攻击后,若怪物被击败,cur_monster指向下一只,current_hp更新为其初始血量,攻击力重置为1。
      线性遍历操作序列,时间复杂度O(m)O(m).

    注意,由于按照stringstring读入的字符串下标是从00开始,所以第下标为ii的位置对应的是第i+1i+1位。

    #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    int main() {
        int n, m;
        cin >> n >> m;
        
        vector<int> a(n);
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
        
        string ops;
        cin >> ops;
        
        vector<int> defeat_times(n);
        int attack = 1;
        int current_monster = 0;
        
        for (int op_num = 0; op_num < m; ++op_num) {
            char op = ops[op_num];
            if (op == '1') {
                a[current_monster] -= attack;
                if (a[current_monster] <= 0) {
                    defeat_times[current_monster] = op_num + 1;
                    current_monster++;
                    if (current_monster >= n) break; 
                }
                attack = 1; 
            } else if (op == '2') {
                attack++; 
            }
        }
    
        for (int i = 0; i < n; ++i) {
            cout << defeat_times[i] << " ";
        }
        cout << endl;
        
        return 0;
    }
    
    • 1

    Information

    ID
    1502
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    8
    Tags
    (None)
    # Submissions
    193
    Accepted
    30
    Uploaded By