牛客题解 | 年会抢玩偶游戏
题目
解题思路
这是一道数学推导题目。根据题目规则:
- \(N\) 个人排成一排,共有 \(M\) 个玩偶
- 每个人抢到的玩偶不能比左右两边的人多两个或以上
- 第 \(K\) 个位置的人想要赢得游戏
求解步骤:
- 假设第 \(K\) 个位置的人抢到 \(x\) 个玩偶
- 根据规则,相邻位置的人最少要抢到 \(x-1\) 个玩偶
- 往两边递推,每个位置最少要抢到的玩偶数量会依次减1
- 通过数学推导得出最优解公式:\(x = \frac{2\times M + 2\times k^2 - 2\times k - 2\times k\times N + N^2 + N}{2\times N}\)
代码
#include <iostream>
using namespace std;
int main() {
int N, M, k;
cin >> N >> M >> k;
// 输入验证
if (N <= 0 || M <= 0 || k <= 0) {
cout << 0;
return 0;
}
// 计算最优解
int x = (2*M + 2*k*k - 2*k - 2*k*N + N*N + N) / (2*N);
// 验证结果是否有效
if (x < 0 || x > M) {
cout << 0;
} else {
cout << x;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int k = sc.nextInt();
if (N <= 0 || M <= 0 || k <= 0) {
System.out.println(0);
return;
}
int x = (2*M + 2*k*k - 2*k - 2*k*N + N*N + N) / (2*N);
if (x < 0 || x > M) {
System.out.println(0);
} else {
System.out.println(x);
}
}
}
def solve(N: int, M: int, k: int) -> int:
if N <= 0 or M <= 0 or k <= 0:
return 0
x = (2*M + 2*k*k - 2*k - 2*k*N + N*N + N) // (2*N)
return x if 0 <= x <= M else 0
N, M, k = map(int, input().split())
print(solve(N, M, k))
算法及复杂度
- 算法:数学推导
- 时间复杂度:\(\mathcal{O}(1)\) - 只需要进行简单的数学计算
- 空间复杂度:\(\mathcal{O}(1)\) - 只使用了常数级别的额外空间

浙公网安备 33010602011771号