牛客题解 | 年会抢玩偶游戏
题目
解题思路
这是一道数学推导题目。根据题目规则:
- \(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号
浙公网安备 33010602011771号