当前位置: 首页 > news >正文

P9339 [JOIST 2023] 曲奇 / Cookies 题解

首先可以发现,假如知道了最终盒子的数量以及各自的大小,求出一组方案是容易的。贪心地从剩余最多的一种饼干中选一个放进盒子,只要盒子的分布是合法的,这样也必然能求出一组合法解。

只需求出盒子的分布即可。

把饼干放进盒子的过程抽象成二分图匹配。二分图的左部点是饼干,右部点是盒子,每一对左部点和右部点之间都有边,边权为 \(1\)。由 Hall 定理,任意提取一个右部点集合 \(S\),都有 \(\sum_{i\in S}c_i\le\sum_{i=1}^n\min(a_i,|S|)\)。这里比较厉害。然后注意到,只要让盒子的大小降序排序,那么前 \(|S|\)\(c_i\) 是上述限制的最严格情况。

然后就可以 DP,考虑可行性 DP。设 \(f_{i,j,k}\) 表示考虑了前 \(i\) 种盒子大小,开了 \(j\) 个盒子,当前总和为 \(k\) 的可行性。初始 \(f_{0,0,0}=1\)。转移有

\[f_{i,j,k}\gets f_{i-1,j,k}\lor f_{i,j-1,k-b_i} \]

首先 \(b_i\times j\le V\),所以第二维实际上只有 \(\log n\) 级别。然后第三维用 bitset 优化,总复杂度 \(O(\frac{n^2\log n}w)\)

#include<bits/stdc++.h>
#define il inline
using namespace std;constexpr int MAXN=15005;
int n,a[MAXN],m,b[MAXN],V,sm[MAXN];
bitset<MAXN>msk[MAXN];
vector<bitset<MAXN>>f[MAXN];
int c[MAXN];
il void dfs(int i,int j,int k){if(!i||!j||!k) return;if(k>=b[i]&&f[i][j-1][k-b[i]]) c[j]=b[i],dfs(i,j-1,k-b[i]);else dfs(i-1,j,k);
}int main(){cin.tie(nullptr)->sync_with_stdio(0);cin>>n;for(int i=1;i<=n;i++){cin>>a[i];V+=a[i];for(int j=1;j<=a[i];j++) sm[j]++;}partial_sum(sm+1,sm+V+1,sm+1);cin>>m;for(int i=1;i<=m;i++) cin>>b[i];reverse(b+1,b+m+1);msk[0].set(0);for(int i=1;i<=V;i++){msk[i]=msk[i-1]<<1;msk[i].set(0);}f[0].assign(1,1);b[0]=V+1;for(int i=1;i<=m;i++){f[i].resize(V/b[i]+1);for(int j=0;j<=V/b[i];j++){bitset<MAXN>tmp;if(b[i-1]*j<=V) tmp=f[i-1][j];if(j) tmp|=f[i][j-1]<<b[i];tmp&=msk[sm[j]];f[i][j]=move(tmp);}}int ans=-1;for(int j=0;j<=V/b[m];j++)if(f[m][j][V]){ans=j;break;}cout<<ans<<'\n';if(!~ans) return 0;dfs(m,ans,V);priority_queue<pair<int,int>>q1,q2;for(int i=1;i<=n;i++) q1.emplace(a[i],i);for(int i=1;i<=ans;i++){cout<<c[i]<<' ';while(c[i]--){auto p=q1.top();q1.pop();cout<<p.second<<' ';if(--p.first) q2.push(p);}cout<<'\n';while(!q2.empty()) q1.push(q2.top()),q2.pop();}return 0;
}
http://www.jsqmd.com/news/330318/

相关文章:

  • AI应用之测试用例(4)
  • 人工智能其实没那么玄乎:看完这篇你就全懂了
  • 完整教程:Laravel下载和安装图解(非常详细)
  • 会干活的机器人来了!motbo机器人到底有啥本事?
  • 【干扰】稀疏重构的空域-极化域联合抗主瓣干扰方法【含Matlab源码 15035期】复现含文献
  • 一天一个开源项目(第9篇):NexaSDK - 跨平台设备端 AI 运行时,让前沿模型在本地运行
  • 广州市PHP定制开发行业解析:概念、实践与常见问题
  • 当15岁成为“红线”,法国社交平台新规落地
  • 效果-Sapphire
  • 印尼IGRS强制令生效,分级不准恐遭全网阻断
  • 商业应用(4)蓝莓产季管理水果基地管理—东方仙盟练气期
  • 汉字不止二维!克莱因瓶解锁汉字拓扑密码:从部首粒子到宇宙演化新语言
  • 自己平台接入国家网络身份认证公共服务接入
  • Agent Skills
  • day73(2.1)——leetcode面试经典150
  • 云雀播放器 2026.1.9 | 高颜值音乐播放器动画非常流畅 全球超1亿用户
  • 【状态估计】基于matlab扩展EKF和无迹卡尔曼滤波UKF ieee33电力系统动态状态估计【含Matlab源码 15032期】
  • Flutter艺术探索-Flutter在鸿蒙端运行原理:OpenHarmony平台集成
  • GrokAI1.1.14-release.09 | 实测可无敏感生图,可生成视频
  • 一个同步机无传感滑膜观测器模型加代码,该模型基于28035芯片,采用了典型的smo+pll方案...
  • 模型训练过程
  • 手把手教你学Simulink——基于Simulink的极点配置控制器设计与仿真建模示例
  • IDEA 提示“未配置SpringBoot配置注解处理器“的解决方案
  • 上下文压缩
  • Claude Code 学习路线图
  • 上下文窗口压缩时,尾>头>中间
  • 【系统分析师】6.3 企业信息化规划
  • Python数据分析:Matplotlib 绘图练习
  • app分享页面已经全部做完了
  • 工作量证明机制的奖励机制存在哪些缺点?