1 条题解
-
0
题解
我们需要找到使总利润最大的最小整数 值。总利润由公式 决定。这是一个关于 的二次函数,可以通过数学方法找到其最大值点。
数学推导
-
利润函数: [ $P(T) = T \cdot (C - T \cdot N) = C \cdot T - N \cdot T^2$ ] 这是一个关于 的二次函数,开口向下(因为 ),其最大值出现在顶点处。
-
求顶点: 二次函数 的顶点横坐标为: [ $T_{\text{vertex}} = \frac{-b}{2a} = \frac{-C}{2 \cdot (-N)} = \frac{C}{2N}$ ] 由于 必须是整数,因此最优的 是离 最近的两个整数之一(即 和 )。
-
边界条件:
- 如果 或 ,则利润恒为 ,此时 。
- 如果 ,则 ,因此最优解为 。
-
最优解:
- 计算 $T_{\text{candidate}} = \left\lfloor \frac{C}{2N} \right\rfloor$ 和 。
- 比较 和 ,选择使利润最大的最小 。
算法步骤
- 如果 或 ,直接返回 。
- 计算 $T_{\text{candidate}} = \left\lfloor \frac{C}{2N} \right\rfloor$。
- 计算 和 。
- 如果 $P(T_{\text{candidate}} + 1) > P(T_{\text{candidate}})$,则 。
- 否则,。
- 如果 或 ,则 。
代码实现
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; int main() { ll n, c; while(scanf("%lld%lld", &n, &c) == 2) { if(n == 0) { printf("0\n"); continue; } ll x = c / (2 * n); ll y = x + 1; printf("%lld\n", x * (c - n * x) >= y * (c - n * y) ? x : y); } return 0; }
-
- 1
信息
- ID
- 2904
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者