Solution -「ARC 125E」Snack
Link.
把 种零食分给 个人,第 种零食有 个;第 个人得到同种零食数量不超过 ,总数量不超过 ,求最多分出的零食数量。
。
很容易看出这是网络流模型:
- 源点 连向每种零食 ,容量 ;
- 零食 连向人 ,容量 ;
- 人 连向汇点 ,容量 。
答案即为 到 的最大流。
在这样的网络中,我们发现容量的种类数少,而边数很多,可以推出边的容量与这条边具体连接两端结点的相关性不强。这种时候,可以尝试手算最小割。
具体地,设零食集合 被割入 部,那么对于一个人 ,他被割入 部的代价为 ,被割入 部的代价是 ,我们应取两者较小值,而这果然与 集合具体构成不相关。所以,枚举 ,每个人一定在一段前缀中被割入 部,在其余情况被割入 部,利用单调性维护这一过程,做到复杂度 ,两个瓶颈皆为排序。
/*~Rainybunny~*/
#include <bits/stdc++.h>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
typedef long long LL;
inline void chkmin( LL& a, const LL b ) { b < a && ( a = b ); }
const int MAXN = 2e5;
int n, m, b[MAXN + 5], ord[MAXN + 5];
LL a[MAXN + 5], c[MAXN + 5];
int main() {
scanf( "%d %d", &n, &m );
rep ( i, 1, n ) scanf( "%lld", &a[i] );
rep ( i, 1, m ) scanf( "%d", &b[i] ), ord[i] = i;
rep ( i, 1, m ) scanf( "%lld", &c[i] );
std::sort( a + 1, a + n + 1,
[]( const LL u, const LL v ) { return u > v; } );
std::sort( ord + 1, ord + m + 1, []( const int u, const int v )
{ return 1ull * c[u] * b[v] < 1ull * c[v] * b[u]; } );
LL sa = 0, sb = 0, sc = 0, ans = 1ll << 60;
rep ( i, 1, n ) sa += a[i];
rep ( i, 1, m ) sb += b[i];
for ( int i = 0, j = 1; i <= n; ++i ) {
sa -= a[i];
for ( ; j <= m && 1ll * i * b[ord[j]] > c[ord[j]];
sb -= b[ord[j]], sc += c[ord[j++]] );
chkmin( ans, sa + i * sb + sc );
}
printf( "%lld\n", ans );
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-08-23 Solution -「LOCAL」Burning Flowers