1 条题解
-
0
思路
题意简述:教室有两排座位,每排 个。有 只猴子只坐第 1 排, 只只坐第 2 排, 只两排都可。求最多能让多少只猴子坐下。
贪心策略:先满足有偏好的猴子,再让无偏好的猴子填补空位。
- 第 1 排有 个座位,最多安置 只“只坐第 1 排”的猴子,剩余座位数 。
- 第 2 排同理,安置 只,剩余 。
- 无偏好的猴子可以坐任意一排,最多再安置 只。
- 三部分相加即为答案。
正确性:设第 1 排实际坐下的“偏好第 1 排”猴子为 ,第 2 排为 ,灵活猴子为 。显然 、,且灵活猴子受两排剩余座位限制,。当 不超过剩余座位时,目标值 随 增大而增大,而 的上界正是 ,贪心取到了这个上界;当 大于剩余座位时,两排会被坐满 个,这也是总容量的上限。所以贪心得到的方案一定最优。
复杂度:每组数据只做常数次运算,时间 (共 ),空间 。
代码
#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
- 上传者