题目链接:点我点我:-) —只有洛谷有此题

题目描述
奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉。奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出来,并且必须在第di秒之前将它吃掉。第j只老鼠吃奶酪的速度为sj,因此如果它单独吃完第i快奶酪所需的时间为pi/sj。老鼠们吃奶酪的习惯很独特,具体来说:
(1) 在任一时刻,一只老鼠最多可以吃一块奶酪;
(2) 在任一时刻,一块奶酪最多被一只老鼠吃。
由于奶酪的保质期常常很短,为了将它们全部吃掉,老鼠们需要使用一种神奇的魔法来延长奶酪的保质期。将奶酪的保质期延长T秒是指所有的奶酪的di变成di+T。同时,使用魔法的代价很高,因此老鼠们希望找到最小的T使得可以吃掉所有的奶酪。

输入格式
输入文件的第一行包含一个整数K,表示输入文件中数据的组数。
每组数据的第一行包含两个整数n和m,分别表示奶酪和老鼠的数量。接下来的n行每行包含三个整数pi,ri,di。最后m行每行包含一个整数,表示sj。pi,ri,di,sj的含义如上文所述。

输出格式
包含K行,每行包含一个实数,表示你找到的最小的T。你的答案和标准答案的绝对误差不应超过10−410^{-4}。

数据规模
30%的数据中,1≤n,m≤5;
100%的数据中,1≤K≤5,1≤n,m≤30,1≤pi≤10510^5, 0 ≤ri < di≤10710^7,1≤sj≤10510^5。

思路
网络流好题
应该容易想到二分答案和离散化奶酪的时间点

先考虑朴素的建图,也就是不考虑每个时刻可以有多只老鼠在不同的小时刻吃同一个奶酪
1.我们将源点每个奶酪链流量为p[i]的边
2.然后把每只老鼠的每个时间段拆为一个点,再将其与对应的奶酪连边,流量为这只老鼠可以在这个时间段吃多少奶酪
3.所有的老鼠向汇点连边,无限流量

然而题目有限制,每个时刻可以有多只老鼠在不同的小时刻吃同一个奶酪,做法很巧妙,我们可以对老鼠的速度再进行拆点,把s[]从大到小排序然后与下一个作差,如”9 6 2 1” -> “3 4 1 1”,然后再将其与汇点连边的流量改为(rat为老鼠编号,dur为时间段大小,s为作差后的数组)rat*s[rat]*dur即可

为什么呢?
可以发现速度进行过如此处理之后,
9 = 3+4+1+1
6 = 4+1+1
2 = 1+1
1 = 1
9+6+2+1 = 3*1 + 4*2 + 1*3 + 1*4
(下面所有的s数组均为作差后的数组)
1.所以,当我们把老鼠点到汇点的流量限制设为rat*s[rat]*dur后,对于每一只老鼠,它‘吃’的量不超过实际可以‘吃’的量。(上述式子解释了,实际包括编号比它小的老鼠的吃的量)
2.每个老鼠点与奶酪的连边为s[rat]*dur,这样可以保证每只老鼠实际不可以超过自己这段时间可以吃的奶酪。
3.(对于第2点的解释)实际这段时间奶酪被吃的量不超过最快的老鼠的速度在这个时间段可以吃的量,如果每只老鼠在2点所述的边满流,那么实际相当于吃的最快的老鼠吃了这一整个时间段。而任何其它的情况均可以用别的老鼠凑出来,且由于第一点不会不合法

最后,每次二分答案,重新构图跑最大流,检查是否满流即可。

感想
很好的网络流题目,然而连网络流都没想到是什么鬼???
原来网络流构图还可以这么神奇,把每个点使劲拆成这个鬼样子!!!
网络流的代码应该没什么问题了,但是构图能力还要再提高啦!
吐槽一下我调了3个小时的错误:
1.精度eps,写错居然可以导致最大流超过了我的p数组值的和!!!
2.我的天哪:(f=dfs(e.to, fmin(Mint, e.cap-e.flow)))>eps 这句话我不小心把 > eps写到最后一个括号里面了。。

代码

//miaomiao 2017.2.3
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>using namespace std;#define pb push_back
#define Set(a, v) memset(a, v, sizeof(a))
#define For(i, a, b) for(int i = (a); i <= (int)(b); i++)#define MN (30+5)
#define N (3000+5)
#define eps (1e-6)struct Edge{int from, to;double cap, flow;
};struct Dinic{vector<int> G[N];vector<Edge> edges;int m, s, t;int cur[N], d[N]; void init(){For(i, 0, N-1) G[i].clear();edges.clear(); }void AddEdge(int u, int v, double cap){edges.pb((Edge){u, v, cap, 0});    edges.pb((Edge){v, u, 0, 0});m = edges.size();G[u].pb(m-2); G[v].pb(m-1);}bool Bfs(){queue<int> q;q.push(s); Set(d, 0);d[s] = 1; int now;while(!q.empty()){now = q.front(); q.pop();For(i, 0, G[now].size()-1){Edge &e = edges[G[now][i]];if(!d[e.to] && e.cap-e.flow > eps){d[e.to] = d[now]+1;q.push(e.to);}}}return d[t];}double dfs(int now, double Mint){if(Mint < eps || now == t) return Mint;double f;double ret = 0.0;for(int &i = cur[now]; i < G[now].size(); i++){Edge &e = edges[G[now][i]];if(d[e.to]==d[now]+1 && (f=dfs(e.to, fmin(Mint, e.cap-e.flow)))>eps){e.flow += f; Mint -= f;edges[G[now][i]^1].flow -= f;ret += f;if(Mint < eps) return ret;}}return ret;}double Maxflow(){double ret = 0.0;while(Bfs()){Set(cur, 0);ret += dfs(s, (1LL<<60)*1.0);}return ret;}
}Din;int n, m;
double L, R, rp[MN], rr[MN], rd[MN], rs[MN], Ti[MN*2];void solve(){double mid, la, sum = 0;int pn;For(i, 1, n) sum += rp[i];while(R-L > eps){mid = (L+R)/2.0;Din.init();For(i, 1, n) Din.AddEdge(0, i, rp[i]);For(i, 1, n){Ti[2*i-1] = rr[i]; Ti[2*i] = rd[i]+mid;            }sort(Ti+1, Ti+2*n+1);Din.s = 0; Din.t = m*2*n+n+1; pn = n;For(rat, 1, m){la = Ti[1];For(i, 2, 2*n){if(Ti[i]-la < eps) continue;++pn; Din.AddEdge(pn, Din.t, rat*rs[rat]*(Ti[i]-la));For(j, 1, n)if(rr[j]-la < eps && (rd[j]+mid)-Ti[i] > -eps)Din.AddEdge(j, pn, rs[rat]*(Ti[i]-la));la = Ti[i];}}if(sum-Din.Maxflow() < eps) R = mid;else L = mid;}printf("%lf\n", L);
}int main(){int T;double tot;scanf("%d", &T);while(T--){tot = 0.0;scanf("%d%d", &n, &m);For(i, 1, n) scanf("%lf%lf%lf", &rp[i], &rr[i], &rd[i]), tot += rp[i];For(i, 1, m) scanf("%lf", &rs[i]); sort(rs+1, rs+m+1, greater<int>());R = tot/rs[1] + 1.0; L = 0;For(i, 1, m-1) rs[i] -= rs[i+1];solve();}return 0;
}

ZJOI 2010 贪吃的老鼠 最大流相关推荐

  1. [ZJOI2010]贪吃的老鼠

    P2570 [ZJOI2010]贪吃的老鼠 在Ta的博客查看 显然二分,最大流判定 要满足两个条件: (1) 在任一时刻,一只老鼠最多可以吃一块奶酪: (2) 在任一时刻,一块奶酪最多被一只老鼠吃. ...

  2. Luogu P2570 [ZJOI2010]贪吃的老鼠

    Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...

  3. 洛谷 P2570 [ZJOI2010]贪吃的老鼠

    洛谷 P2570 [ZJOI2010]贪吃的老鼠 题目 题目描述 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒 ...

  4. [ZJOI2010] 贪吃的老鼠(二分+差分+神仙建图网络流)

    problem luogu-P2570 solution 卧槽网络流尼玛神题 首先这个最小延长时间 TTT ,套路地考虑二分,将问题转化为判定性问题. 其次 n,mn,mn,m 和奶酪存在时间 [l, ...

  5. 22Exchange Server 2010跨站点部署-邮件流测试及重定向

    11.5.2 OWA登陆发送测试(重定向) 使用https://mail.robin.com/owa登陆下上海分支机构的用户 可以看到,登陆成功,这里就使用到了重定向 11.5.3 SH-GZ邮件流 ...

  6. 洛谷$P2570\ [ZJOI2010]$贪吃的老鼠 网络流+二分

    正解:网络流+二分 解题报告: 传送门$QwQ$ 和上一题有点儿像,,,?$QwQ$但是比上一题要有趣很多$QwQ$ 首先把大致思路捋下?依然是.二分出每个奶酪的开始和结束时间,然后check下最大流 ...

  7. 【网络流】LGP2570 [ZJOI2010]贪吃的老鼠

    [题目] 原题地址 原题说的很清楚了,在这里也贴出来吧. 奶酪店里最近出现了m只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产n块奶酪,其中第i块的大小为pi,会在第ri秒被生产出 ...

  8. P2570 [ZJOI2010]贪吃的老鼠

    传送门 →_→唯一一篇能看得懂的题解---->这里 很容易想到二分+网络流,然而并没有什么卵用--出题人的思路太神了-- 首先考虑如果一块奶酪在同一时间可以被多只老鼠吃的话,该如何建图.首先不难 ...

  9. [ZJOI 2010]count 数字计数

    Description 题库链接 问你 \([l,r]\) 区间内所有整数中各个数码出现了多少次. \(1\leq a\leq b\leq 10^{12}\) Solution 数位 \(DP\) . ...

  10. DP专练2 (大理石 + [ZJOI 2010]数字计数)

    你肯定以为DP专练会有很多题, 但是请考虑一下本仙女的DP码力,一次性能更几个题... 来吧,别害怕呀~~ 文章目录 大理石 题目 题解 代码实现 数字计数 题目 题解 代码实现 大理石 题目 林老师 ...

最新文章

  1. hdu 5366 简单递推
  2. 2011年工作总结和展望(上篇)
  3. 和老师一定要保持沟通
  4. 列表数据提交_Mybatis-实现数据的增删改查
  5. 在android studio中,引用.so文件
  6. 爬虫-代理的爬取练习191110
  7. android app 颜色搭配,色采 - 写给大家用的配色 App - Android 应用 - 【最美应用】
  8. 计算机工程制图cad,物流工程制图CAD计算机绘图指导教程
  9. FEC(前向纠错码)
  10. matlab列联表的独立性检验,(8.4列联表独立性分析案例.ppt
  11. 微信小程序:获取验证码
  12. 斐波那契数列各种方法求解
  13. SAP S4 HANA 银行账户管理(Bank Account Management)- S4中的变化、数据维护平台介绍和配置实操等
  14. 由浪潮8控存储登顶SPC-1所想,存储系统一个长期被忽略的指标
  15. HTML怎么设艺术字体,用CSS设计艺术字集锦(二)
  16. 谷歌和IE的兼容问题
  17. 转码解密挖矿 显卡计算能力大对比
  18. 【设计】电流偏置设计
  19. PS - 图层显示索引不能做修改(将索引图层改为正常图层)
  20. TCP报文之-tcp dup ack 、tcp Out-of-Order

热门文章

  1. easyUI 上传文件
  2. 北京邮电计算机学院保研概率,北京邮电大学计算机学院(专业学位)计算机技术保研细则...
  3. CSS——run-in元素
  4. 不会做PPT图表?1000个高大上的PPT图表,0门槛0套路,想要就给你
  5. 生物群落多样性——β多样性
  6. java.lang.NoSuchMethodError 之 依赖冲突解决方案
  7. c语言函数平方根公式,c语言求平方根公式
  8. Snagit 2019 快速截图
  9. 虚拟机搭建haddoop、zookeeper、hbase集群
  10. stylelint规则大全