bluecode-最大战力值

30 阅读2分钟

问题描述

小F正在设计一款手游,游戏中的角色战力值需要根据一定规则来平衡,以提升玩家的游戏体验。现在游戏中有 n 个角色,编号从 0 到 n-1。为了保证平衡性,角色战力值需要遵循以下规则:

  1. 编号为 0 的角色战力值初始为 0
  2. 每个角色的战力值必须是非负整数。
  3. 相邻角色的战力值差不能超过 1,即两个相邻角色的战力值差可以是 0+1 或 -1

除此之外,游戏策划还为某些角色设定了最大战力值。这些限制通过若干数对给出,每一个数对 limit[i] = [index, maxPower],表示编号为 index 的角色的战力值不能超过 maxPower。这些限定只会对编号不为 0 的角色生效。

你的任务是根据上述规则和限制,计算游戏中单个角色能达到的最大战力值。


测试样例

样例1:

输入:n = 3 ,m = 2 ,limit = [[1, 3], [2, 2]]
输出:2

样例2:

输入:n = 5 ,m = 3 ,limit = [[1, 1], [2, 3], [4, 3]]
输出:3

样例3:

输入:n = 4 ,m = 1 ,limit = [[2, 2]]
输出:3

#include <vector>
#include <algorithm>
#include <iostream>
#include <climits>

int solution(int n, int m, const std::vector<std::vector<int>>& limits) {
    std::vector<int> power(n, INT_MAX);  // 使用 INT_MAX 替代 float('inf')
    power[0] = 0;  // 角色0的战力值初始为0

    // 应用最大战力限制
    for (const auto& limit : limits) {
        int index = limit[0];
        int max_p = limit[1];
        power[index] = std::min(power[index], max_p);
    }

    // 从左到右传递限制
    for (int i = 1; i < n; i++) {
        power[i] = std::min(power[i], power[i-1] + 1);
    }

    // 从右到左传递限制
    for (int i = n - 2; i >= 0; i--) {
        power[i] = std::min(power[i], power[i+1] + 1);
    }

    // 返回最大值
    return *std::max_element(power.begin(), power.end());
}

int main() {
    // Add your test cases here

    std::cout << (solution(3, 2, {{1, 3}, {2, 2}}) == 2) << std::endl;
    std::cout << (solution(5, 3, {{1, 1}, {2, 3}, {4, 3}}) == 3) << std::endl;

    return 0;
}