问题描述
小F正在设计一款手游,游戏中的角色战力值需要根据一定规则来平衡,以提升玩家的游戏体验。现在游戏中有 n 个角色,编号从 0 到 n-1。为了保证平衡性,角色战力值需要遵循以下规则:
- 编号为
0的角色战力值初始为0。 - 每个角色的战力值必须是非负整数。
- 相邻角色的战力值差不能超过
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;
}