[lnsyoj2271/luoguP3745/省选联考 2017]期末考试
题意
给定长度为 的序列 和长度为 的序列 ,以及常数 ,可以进行两种操作:
- 选取任意 ,并使 ,记进行了 次这种操作;
- 选取任意 ,并使 ,记进行了 次这种操作。
求进行若干次操作后,
的最小值。
sol
我们可以枚举 的值 ,贪心地计算在这种情况下最小的 ,具体地,设 。 若 ,则 ,即结果为 ,否则,对 和 两种情况进行大力分讨,然后加上 即可 ,推导仿照上例显然。
我们发现,我们需要计算一段的和,因此提前排序并预处理前缀和即可。
时间复杂度 ,理论可以优化到 ,瓶颈就变成了前缀和了
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef unsigned long long ULL;
const int N = 100005;
int n, m;
int t[N], b[N];
ULL st[N], sb[N];
int A, B;
ULL C;
int main(){
scanf("%d%d%lld", &A, &B, &C);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &t[i]);
for (int i = 1; i <= m; i ++ ) scanf("%d", &b[i]);
sort(t + 1, t + n + 1 ), sort(b + 1, b + m + 1);
for (int i = 1; i <= n; i ++ ) st[i] = st[i - 1] + t[i];
for (int i = 1; i <= m; i ++ ) sb[i] = sb[i - 1] + b[i];
int l = t[1], r = b[m];
__int128 ans = 1e35;
for (int time = l; time <= r; time ++ ) {
int bpr = upper_bound(b + 1, b + m + 1, time) - b;
int bpl = bpr - 1;
int mvp = upper_bound(t + 1, t + n + 1, time) - t - 1;
__int128 res = 0;
if (B <= A) res = ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1)) * B;
else if ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1) <= (ULL) time * bpl - sb[bpl]) res = ((sb[m] - sb[bpr - 1]) - (ULL) time * (m - bpr + 1)) * A;
else res = (__int128) ((ULL) time * bpl - sb[bpl]) * A + (__int128) (sb[m] - sb[bpr - 1] - (ULL) time * (m - bpr + 1) - ((ULL) time * bpl - sb[bpl])) * B;
res += (__int128) (-st[mvp] + (ULL) time * mvp) * C;
ans = min(ans, res);
}
> (ULL) ans);
return 0;
} printf("%llu\n", (ULL) ans);
return 0;
}
分类:
题解 / 2024训练
标签:
基础算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现