你有一个容量为k的空书架,现在共有n个请求,每个请求给定一本书ai,如果你的书架里没有这本书,你就必须以ci的价格购买这本书放入书架. 当然,你可以在任何时候丢掉书架里的某本书.请求出完成这n个请求所需要的最少价钱. 做法1: 把每个请求拆成两个点 A,B A表示买入 B表示卖出 addedge(S,A,1,c[a[i]]) addedge(A,B,1,0) addedge(B,T,1,0) 这样最大流必是n 每天的A向下一天的A连流量为k-1,费用为0的边,表示可以不扔,留到明天,但明天的书还…
题面 CF802C Heidi and Library (hard) 有一个大小为 \(k\) 的空书架.有 \(n\) 天和 \(n\) 种书,每天要求书架中有书 \(a_i\).每天可以多次买书,买书 \(i\) 的价格为 \(c_i\).每天可以扔书(因为书架满了).求满足要求的最小代价. 数据范围:\(1\le n,k\le 80\). 路标 很明显这是一道套路烂大街的水题,但是今天蒟蒻想讲 \(3\) 种巧妙的做法. 此题的输出方案版:CF132E Bits of merry old…
LINK:Heidi and Library 先说一下简单版本的 就是权值都为1. 一直无脑加书 然后发现会引起冲突,可以发现此时需要扔掉一本书. 扔掉的话 可以考虑扔掉哪一本是最优的 可以发现扔掉nex越靠后的结果不会更差. 所以用set/堆维护一下nex的最大值 每次扔掉即可. code //#include<bits/stdc++.h> #include<iostream> #include<cstdio> #include<ctime> #inclu…
题目描述 你有一个容量为k的空书架,现在共有n个请求,每个请求给定一本书ai,如果你的书架里没有这本书,你就必须以ci的价格购买这本书放入书架.当然,你可以在任何时候丢掉书架里的某本书.请求出完成这n个请求所需要的最少价钱. 题解 对于每个请求,我们可以强制让他必须买,然后再去考虑如何扣掉之前的贡献. 对于每一次购买,我们可以作如下两种策划. 1.刚买完就扔掉.2.在下一次购买之前把这本书卖掉(这里的卖掉相当于是把上一次买的代价减去了). 按照这样的策略,我们的每一本买来的书最终都会被弄掉 .…
[CF802C]Heidi and Library(网络流) 题面 CF 洛谷 题解 前面两个Easy和Medium都是什么鬼玩意啊.... 不难发现如果这天的要求就是第\(a_i\)种书的话,那么\(a_i\)是必定要存在的. 把每种书拆\(n\)次,然后用每一个流维护一个书架上的位置,那么这样子很容易就可以连出费用流的建图. 但是这样子点数是平方级别,边数是三方级别. 实际上书架上的位置是无序的,因此并不需要全部建出来,只需要考虑在哪些天会被替换. 考虑每本书下一次在什么情况下会被使用,被使…
[CF802C]Heidi and Library (hard) 题意:有n个人依次来借书,第i人来的时候要求书店里必须有种类为ai的书,种类为i的书要花费ci块钱购入.而书店的容量只有k,多余的书只能丢弃.现在让你安排哪天买哪本书放到书店的哪个位置,使得在满足所有人的情况下总花费最少. $n,k\le 80,c_i\le 10^6$ 题解:最小费用最大流,直接上建图方法: 建两排点i和i'. S -> i 流量1,费用$c_{a_i}$i -> i' 流量1,费用$-inf$i' ->…
C. Heidi and Library 题意 有 n 种分别具有价格 b 的书 a ,图书馆里最多同时存放 k 本书,已知接下来 n 天每天都有一个人来看某一本书,如果图书馆里没有则需要购买,问最少花费多少钱. 分析 这道题的一个简单版本 ,默认所有书价格为1,那么只需要用 set 维护一下,当图书馆内库存满的时候 erase 掉距离最大的书(贪心做法). 但是有了价格之后,就不能贪心了,然后这道题就可以用神奇的网络流解决.准确的说是最小费用最大流. 所有边的容量为 1,将 n 个点拆成 2n…
A. Heidi and Library (easy) time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Your search for Heidi is over – you finally found her at a library, dressed up as a human. In fact, she has spen…
题目链接 感觉跟餐巾计划问题有点像.费用流. 决定每天买不买不太好搞,不如先把所有东西都买进来,再卖掉不必要的. 拆点,每个点拆成\(x,y\). 源点向每个点的\(x\)连费用为当天的价格,流量为1的边. 每个点的\(y\)向汇点连费用为0,流量为1的边. 每个点\(x\)向\(y\)连流量为1,费用为0的边. 此时流出的已经等于流入的了,也就是说最大流一定为\(n\). 现在考虑加入费用限制. 每天的\(x\)向下一天的\(x\)连流量为\(k-1\),费用为0的边,表示可以不扔,留到明天,…
http://codeforces.com/contest/802/problem/B [题意] 有一个图书馆,刚开始没有书,最多可容纳k本书:有n天,每天会有人借一本书,当天归还:如果图书馆有这个本就直接借到,否则图书馆的人会购买这本书,每本书的价格都是1:如果现在图书馆的书已达上限还需购买,必须舍弃已有的一本书,以后再有人借这本书要重新购买. 问图书馆的人最少要花多少钱购书? 数据范围变成了4000 00. [思路] 关键是替换原则,每次都替换下一次出现最晚的,因为它占用图书馆的时间最长.…