1 条题解

  • 0
    @ 2025-5-19 17:25:31

    题解

    我们需要找到使总利润最大的最小整数 TT 值。总利润由公式 P(T)=T(CTN)P(T) = T \cdot (C - T \cdot N) 决定。这是一个关于 TT 的二次函数,可以通过数学方法找到其最大值点。

    数学推导

    1. 利润函数: [ $P(T) = T \cdot (C - T \cdot N) = C \cdot T - N \cdot T^2$ ] 这是一个关于 TT 的二次函数,开口向下(因为 N<0-N < 0),其最大值出现在顶点处。

    2. 求顶点: 二次函数 P(T)=NT2+CTP(T) = -N \cdot T^2 + C \cdot T 的顶点横坐标为: [ $T_{\text{vertex}} = \frac{-b}{2a} = \frac{-C}{2 \cdot (-N)} = \frac{C}{2N}$ ] 由于 TT 必须是整数,因此最优的 TT 是离 TvertexT_{\text{vertex}} 最近的两个整数之一(即 C2N\left\lfloor \frac{C}{2N} \right\rfloorC2N\left\lceil \frac{C}{2N} \right\rceil)。

    3. 边界条件

      • 如果 N=0N = 0C=0C = 0,则利润恒为 00,此时 Toptim=0T_{\text{optim}} = 0
      • 如果 CTNC \leq TN,则 P(T)0P(T) \leq 0,因此最优解为 Toptim=0T_{\text{optim}} = 0
    4. 最优解

      • 计算 $T_{\text{candidate}} = \left\lfloor \frac{C}{2N} \right\rfloor$ 和 Tcandidate+1T_{\text{candidate}} + 1
      • 比较 P(Tcandidate)P(T_{\text{candidate}})P(Tcandidate+1)P(T_{\text{candidate}} + 1),选择使利润最大的最小 TT

    算法步骤

    1. 如果 N=0N = 0C=0C = 0,直接返回 00
    2. 计算 $T_{\text{candidate}} = \left\lfloor \frac{C}{2N} \right\rfloor$。
    3. 计算 P(Tcandidate)P(T_{\text{candidate}})P(Tcandidate+1)P(T_{\text{candidate}} + 1)
    4. 如果 $P(T_{\text{candidate}} + 1) > P(T_{\text{candidate}})$,则 Toptim=Tcandidate+1T_{\text{optim}} = T_{\text{candidate}} + 1
    5. 否则,Toptim=TcandidateT_{\text{optim}} = T_{\text{candidate}}
    6. 如果 Toptim<0T_{\text{optim}} < 0CNToptim<0C - N \cdot T_{\text{optim}} < 0,则 Toptim=0T_{\text{optim}} = 0

    代码实现

    #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
    上传者