题解:[ABC376C] Prepare Another Box
[ABC376C] Prepare Another Box#
题意:#
给定
思路:#
每次给当前体积最大的物品分配当前体积最大的箱子,如果该箱子体积小于当前物品,则添加一个与物品体积相同的箱子,若需要添加两个及以上箱子,则无解。
正确性证明:#
-
为什么用最大箱子?
若可以用非最大箱子,那么最大箱子就留给了其他物品用,这是等价的,并不会对后面的箱子选择产生影响。
-
为什么最大箱子不满足时创建一个箱子?
若当前最大箱子不满足当前最大物品,那么可以取之前的比当前大的箱子来满足当前物品,但这样就没有箱子满足之前箱子对应的物品,需要为那个物品创建箱子,显然不如为当前物品创建箱子更优。
关于正确性的其他问题读者可以自行思考。
代码:#
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, a[200005], b[200005];
bool cmp(ll x, ll y) {
return x>y;
}
int main() {
scanf("%lld", &n);
for(int i=1; i<=n; i++) scanf("%lld", &a[i]);
for(int i=1; i<n; i++) scanf("%lld", &b[i]);
sort(a+1, a+n+1, cmp);
sort(b+1, b+n, cmp);
ll ans=0;
for(int ai=1, bi=1; ai<=n&&bi<n; ai++) {
if(b[bi]<a[ai]) {
if(ans>0) { //之前已经创建过箱子,无解
ans=-1;
break;
} else ans=a[ai]; //存储箱子体积
} else bi++;
}
if(ans==0) ans=a[n]; //前n-1个都满足,那么就为第n个创建箱子
printf("%lld", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具