1 条题解
-
0
题解
将猴子分为三个集合:
- 集合 :只想坐第 排的 只猴子。
- 集合 :只想坐第 排的 只猴子。
- 集合 :无偏好的 只猴子。
教室有 排,每排 个座位。我们需要最大化坐下的猴子数量,且必须满足有偏好猴子的要求。
贪心策略的证明:
如果第 排还有空位,并且集合 中还有未安排的猴子,那么优先把集合 的猴子安排到第 排一定是最优的。原因在于:集合 的猴子可以坐到任意一排,而集合 的猴子只能坐第 排。若我们优先用集合 的猴子填充第 排,可能导致第 排被填满后,仍有集合 的猴子无法入座,而此时第 排也许还有空位,但这些空位对于集合 的猴子是无用的。这样就会造成座位浪费,无法达到最大数量。对称地,对于第 排和集合 也是同样的道理。因此,全局最优的策略是:先尽可能满足有严格偏好的猴子,再用无偏好的猴子填充所有剩余座位。
算法步骤:
-
将集合 的猴子安排到第 排,能坐下的数量为 。
第 排剩余座位数为 。 -
将集合 的猴子安排到第 排,能坐下的数量为 。
第 排剩余座位数为 。 -
此时两排共剩余座位数:
这些剩余座位可以任意分配给集合 的猴子,能坐下的数量为 。
-
总答案即为三部分之和:
时间复杂度: 每组测试数据只需 计算,总复杂度 ,完全可以通过 的数据范围。
C++ 参考代码:
#include<bits/stdc++.h> #define ll long long using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt; cin>>tt; while(tt--) { int m,a,b,c; cin>>m>>a>>b>>c; int ans=0,rem=0; ans+=min(m,a); rem+=m-min(m,a); ans+=min(m,b); rem+=m-min(m,b); ans+=min(rem,c); cout<<ans<<'\n'; } return 0; }
- 1
信息
- ID
- 6672
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者