1 条题解

  • 0
    @ 2026-10-31 17:57:35

    思路

    题意简述:教室有两排座位,每排 mm 个。有 aa 只猴子只坐第 1 排,bb 只只坐第 2 排,cc 只两排都可。求最多能让多少只猴子坐下。

    贪心策略:先满足有偏好的猴子,再让无偏好的猴子填补空位。

    1. 第 1 排有 mm 个座位,最多安置 min⁡(m,a)\min(m,a) 只“只坐第 1 排”的猴子,剩余座位数 r1=max⁡(0,m−a)r_1=\max(0,m-a)。
    2. 第 2 排同理,安置 min⁡(m,b)\min(m,b) 只,剩余 r2=max⁡(0,m−b)r_2=\max(0,m-b)。
    3. 无偏好的猴子可以坐任意一排,最多再安置 min⁡(c, r1+r2)\min(c,\,r_1+r_2) 只。
    4. 三部分相加即为答案。

    正确性:设第 1 排实际坐下的“偏好第 1 排”猴子为 xx,第 2 排为 yy,灵活猴子为 zz。显然 x≤min⁡(m,a)x\le\min(m,a)、y≤min⁡(m,b)y\le\min(m,b),且灵活猴子受两排剩余座位限制,z≤min⁡(c, 2m−x−y)z\le\min(c,\,2m-x-y)。当 cc 不超过剩余座位时,目标值 x+y+cx+y+c 随 x+yx+y 增大而增大,而 x+yx+y 的上界正是 min⁡(m,a)+min⁡(m,b)\min(m,a)+\min(m,b),贪心取到了这个上界;当 cc 大于剩余座位时,两排会被坐满 2m2m 个,这也是总容量的上限。所以贪心得到的方案一定最优。

    复杂度:每组数据只做常数次运算,时间 O(1)O(1)(共 O(t)O(t)),空间 O(1)O(1)。

    代码

    #include <iostream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <map>
    #include <set>
    #include <climits>
    #include <queue>
    #include<stack>
    #include<cmath>
    using namespace std;
    
    int main() {
        int t;
        // 测试用例组数
        scanf("%d", &t);
        while (t--) {
            int m, a, b, c;
            scanf("%d%d%d%d", &m, &a, &b, &c);
    
            // 两排各有 m 个座位,first_line/second_line 表示当前剩余座位
            int first_line = m, second_line = m;
            int ans= 0;
    
            // 先安置只愿意坐第 1 排的猴子,最多 min(m, a) 只
            ans += min(first_line, a);
            if (a > first_line)first_line = 0;
            else first_line = first_line - a;
    
            // 再安置只愿意坐第 2 排的猴子,最多 min(m, b) 只
            ans += min(second_line, b);
            if (b > second_line)second_line = 0;
            else second_line = second_line - b;
    
            // 无偏好的猴子填入两排剩余的空位
            ans += min(second_line + first_line, c);
    
            printf("%d\n", ans);
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    55
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    0
    已通过
    0
    上传者