题目:

贪吃的老鼠(cheese.c/cpp/pas/in/out)

时限:每个测试点10秒

[问题描述]

奶酪店里最近出现了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。你的答案和标准答案的绝对误差不应超过。

输入样例

2

2 2

13 0 4

10 1 3

4

2

1 1

1 0 2

1

输出样例

0.5

0

样例说明

第一组数据中:

l 第0到第1秒:第一只老鼠吃第一块奶酪;

l 第1到第3.5秒:

- 第一只老鼠吃第二块奶酪;

- 第二只老鼠吃第一块奶酪;

l 第3.5到第4.5秒:第一只老鼠吃第一块奶酪。

[数据范围]

思路:

  很好的一道题。。可惜我太弱了。。只想到要二分+网络流判定。。然后就什么也不会了。。只能看了题解。。

本题比较难的是一个时间点只能有一只老鼠,而一个老鼠一个时间点只能吃一个。。

朴素的建图是:

让S向每个奶酪连边,流量为pi

把老鼠按照时间段拆点,然后对于每个点, 向T连边,流量为该时间段能吃掉的奶酪数量

并且把奶酪向每个时间段的老鼠连边,流量为流量为该时间段能吃掉的奶酪数量

最后判断是否满流。。

但是,这样会出现有一个时间点有两只老鼠吃完的情况。。。怎么办?

题解就很巧了。。

我们对老鼠吃的速度也进行分段, 每段为对于前一只老鼠的速度差。。

试想一下,如果一个奶酪一个时间段(长度为T)内有若干只老鼠吃了,不妨设为为3只老鼠,a1,a2,a3,并且速度为s1,s2,s3, 同样假设s1< s2 < s3,

那么是不是这一段时间内老鼠吃了T1*s1 + T2(s2-s1) + T3*(s3-s2)

那是不是就可以把老鼠某个时间段吃的方案等价于多少个速度差吃的方案~~

so,构图如下:

让S向每个奶酪连边,流量为pi

对于每个速度段(第j段为sj)进行拆点为vij'按照时间段(假设时间长为t)拆点,然后对于每个点, 向T连边,流量为该时间段该速度段sj在t时间内的产(sj*t*j)

并且把奶酪向每个时间段的速度段vij连边,流量为sj*t

最后判断是否满流。。

这样一来,每个速度段在每个时间段最多只有出现一个,这样就满足一对一的情况。。

好吧。。说的很混乱。。直接上代码吧。。

code:

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <vector>
#define maxn 1200
#define Inf 0x3fffffff
#define maxm 210000
#define eps 1e-8
#define M0(a) memset(a, 0, sizeof(a))
using namespace std;
int cmp(double x, double y){
return fabs(x - y) <= eps;
}
int sgn(double x){
return (x > eps) - (x < -eps);
}
struct oo{
int y, next;
double f;
};
struct MaxFlow{
int n, S, T, tot;
int son[maxn], dist[maxn], gap[maxn];
oo e[maxm];
double sap(int x, double aug){
if (x == T) return aug;
int mind = n;
double sum = , f;
for (int p = son[x]; p != -; p = e[p].next){
int y = e[p].y;
if (dist[y] + == dist[x] && e[p].f){
f = sap(y, min(e[p].f, aug - sum));
e[p].f -= f;
e[p^].f += f;
sum += f;
if (sum == aug || dist[S] >= n) return sum;
}
if (e[p].f) mind = min(mind, dist[y]);
}
if (!sum){
if (!(--gap[dist[x]])) dist[S] = n;
++gap[dist[x] = mind + ];
}
return sum;
} void add(int x, int y, double f){
e[tot].y = y; e[tot].f = f;
e[tot].next = son[x]; son[x] = tot++;
e[tot].y = x; e[tot].f = ;
e[tot].next = son[y]; son[y] = tot++;
} void init(int S, int T, int n){
memset(son, -, sizeof(son));
tot = ;
this->S = S, this->T = T, this->n = n;
}
double maxflow(){
M0(gap);
M0(dist);
gap[] = n;
double ans = ;
while (dist[S] < n) ans += sap(S, Inf);
return ans;
}
} F;
int n, m, p[maxn], r[maxn], d[maxn], s[maxn]; void init(){
scanf("%d%d", &n, &m);
for (int i = ; i <= n; ++i)
scanf("%d%d%d", &p[i], &r[i], &d[i]);
for (int i = ; i <= m; ++i)
scanf("%d", &s[i]);
sort(s+, s++m, greater<int>());
for (int i = ; i < m; ++i)
s[i] -= s[i+];
} int check(double add){
vector<double> v;
for (int i = ; i <= n; ++i)
v.push_back(r[i]), v.push_back(d[i]+add);
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end(), cmp), v.end());
int S = , T = m*(v.size()-)+n+;
F.init(, T, T+);
for (int i = ; i <= n; ++i)
F.add(S, i, p[i]);
for (int i = ; i + < (int)v.size(); ++i){
double dur = v[i+]-v[i];
for (int j = ; j <= m; ++j)
F.add(i * m + n + j, T, j*s[j]*dur);
for (int j = ; j <= n; ++j)
if (sgn(r[j]-v[i]) <= && sgn(d[j]+add-v[i+]) >= )
for (int k = ; k <= m; ++k)
F.add(j, n+i*m+k, dur*s[k]);
}
double sum = ;
for (int i = ; i <= n; ++i)
sum += p[i];
double flow = F.maxflow();
return sgn(flow - sum) == ;
} void solve(){
double l = , r = ;
for (int i = ; i < ; ++i){
double mid = (l + r) / 2.0;
check(mid) ? r = mid : l = mid;
}
printf("%.7lf\n", l);
} int main(){
freopen("a.in", "r", stdin);
freopen("a.out", "w", stdout);
int T;
scanf("%d", &T);
while (T--){
init();
solve();
}
}

 

[zjoi2010]cheese的更多相关文章

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

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

  2. CF 371B Fox Dividing Cheese[数论]

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  3. [BZOJ1833][ZJOI2010]count 数字计数

    [BZOJ1833][ZJOI2010]count 数字计数 试题描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入 输入文件中仅包含一行两个整数a ...

  4. hdu 1078 FatMouse and Cheese

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...

  5. HDU 1078 FatMouse and Cheese(记忆化搜索)

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. ZOJ 1107 FatMouse and Cheese

    原题链接 题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese.有两个规则:1)他跑的总距离不能超过k步:2)下一个节点的cheese的块数 ...

  7. Codeforces Round #218 (Div. 2) B. Fox Dividing Cheese

    B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...

  8. hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)

    pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/ ...

  9. AOJ 0558 Cheese

    Cheese Time Limit : 8 sec, Memory Limit : 65536 KB チーズ (Cheese) 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から ...

随机推荐

  1. PHP——explode的应用(获取字符串,拆为下拉列表)

    <?php //定义有默认值的函数 function Main3($f=5,$g=6) { echo $f*$g; } Main3(2,3); echo "<br />&q ...

  2. javascript 高级程序设计 二

    这里我们直接进入主题: 在JS刚刚开始的时候,必须面临一个问题,那就是如何使的JS的加载和执行不会影响web核心语言HTML的展示效果,和HTML和谐共存. 在这个背景下<script>标 ...

  3. JS 实现 jQuery的$(function(){});

    1.浏览器渲染引擎的HTML解析流程 何谓“渲染”,其实就是浏览器把请求到的HTML内容显示出来的过程.渲染引擎首先通过网络获得所请求文档的内容,通常以8K分块的方式完成.下面是渲染引擎在取得内容之后 ...

  4. linux中的定时任务创建

    1.查看root用户身份下正常运行的定时任务 crontab -l -u XXX 列出XXX用户的所有定时任务,如有没有会提示 no crontab for XXX列出所有的用户:cat /etc/p ...

  5. 卸载服务器GitLab

    sudo gitlab-ctl uninstall sudo rpm -e gitlab-ce find / -name gitlab|xargs rm -rf

  6. MCS-51与8086指令系统比较

  7. Codeforces 767B. The Queue 模拟题

    B. The Queue time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...

  8. NC 5系查询引擎做报表

    在集团下打开查询引擎管理节点,选中查询设计,鼠标移动到创建,点击文件夹 文件夹名字按需求起,创好文件夹后选中该文件夹后鼠标移动到创建,点击对象. 按需求起好编码和名称 都创建好后,点击SQL手工设计 ...

  9. JDK 规范目录

    JDK 规范目录 1.1 Java 异常处理 2.1 JDK 之 NIO 2 WatchService.WatchKey(监控文件变化) https://mp.weixin.qq.com/s/NIn2 ...

  10. wepy中页面的跳转

    1.在pages中创建好页面之后,需要在app.wpy中的config中配置好页面路由:2.如果跳转的按钮在page页面中 this.$navigate({url:"content" ...