题解 CF802N 【April Fools' Problem (medium)】

题意简述

给定两个序列,{ai}{bi}。要求选出 {ik}{jk},满足:

  • ilim(1lmk)jljm(1lmk)
  • ipjp(1pk)

min(p=1k(aip+bjp))

思路简述

我们先看一眼数据范围——n2200,这暗示我们时间复杂度应该会劣于O(n2)

我们考虑一个图,满足:

  • n+2 个节点,其中第 i1 个节点,编号为 ii=1,2,3,,n),有一个起点(源)s,一个终点(宿)t
  • 对于每一天(记当天为第 i 天,i=1,2,3,,n),加 3 条边:
    • si,流量为 1,费用为 ai
    • ii+1,第 n 天无此边,流量为 k,费用为 0
    • it,流量为 1,费用为 bi

不难看出,在该图中,当流量为 k 时,最小费用刚好为我们所求的 min(p=1k(aip+bjp))。随便分析一下时间复杂度,为 O(nm),足以通过此题。

核心代码如下(用到了 AtCoder 的模板库):

int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); cin >> n >> k; mcf_graph<ll, ll> graph(n + 2); for (int i = 1; i <= n; i++) { int temp; cin >> temp; graph.add_edge(0, i, 1, temp); if (i < n) graph.add_edge(i, i + 1, k, 0); } for (int i = 1; i <= n; i++) { int temp; cin >> temp; graph.add_edge(i, n + 1, 1, temp); } pair<long long, long long> ans = graph.flow(0, n + 1, k); cout << ans.second << endl; return 0; }

__EOF__

本文作者David H
本文链接https://www.cnblogs.com/David-H-Devs/p/14174992.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   David_H_Devs  阅读(82)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示