[zjoi2010]cheese
题目:
贪吃的老鼠(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的更多相关文章
- Luogu P2570 [ZJOI2010]贪吃的老鼠
Luogu P2570 [ZJOI2010]贪吃的老鼠 题目描述 奶酪店里最近出现了\(m\)只老鼠!它们的目标就是把生产出来的所有奶酪都吃掉.奶酪店中一天会生产\(n\)块奶酪,其中第\(i\)块的 ...
- CF 371B Fox Dividing Cheese[数论]
B. Fox Dividing Cheese time limit per test 1 second memory limit per test 256 megabytes input standa ...
- [BZOJ1833][ZJOI2010]count 数字计数
[BZOJ1833][ZJOI2010]count 数字计数 试题描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入 输入文件中仅包含一行两个整数a ...
- hdu 1078 FatMouse and Cheese
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 1078 FatMouse and Cheese(记忆化搜索)
FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- ZOJ 1107 FatMouse and Cheese
原题链接 题目大意:FM在一个街道n*n街道的(0,0)点,在每个网格里放着cheese,他要尽可能多的吃这些cheese.有两个规则:1)他跑的总距离不能超过k步:2)下一个节点的cheese的块数 ...
- 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 ...
- hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)
pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- AOJ 0558 Cheese
Cheese Time Limit : 8 sec, Memory Limit : 65536 KB チーズ (Cheese) 問題 今年も JOI 町のチーズ工場がチーズの生産を始め,ねずみが巣から ...
随机推荐
- 大数加法java版
import java.util.*; import java.math.BigDecimal; public class Numadd{ public static void main(String ...
- LED
LED 时间限制: 1 Sec 内存限制: 128 MB 题目描述 数字显示器题目描述:最近学校晚上文化广场的人很多哇,原因是晚上大屏幕会放电影.无聊的艾神和x73也决定一起去文化大广场看一场电影, ...
- P1083龙舟比赛
题目如下: 现在正在举行龙舟比赛,我们现在获得了最后冲刺时的俯视图像,现在你要输出各条龙舟的名次. 这张图像由r行c列的字符组成,每行的最左边的字符表示起点,所以字符为'S',最右边的字符为'F'.并 ...
- Hotspot参数分析
-XX:+HeapDumpOnOutOfMemoryError 让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析 -Xmx与-Xms 虚拟机堆参数 -Xoss 设置本地方法栈 ...
- 大神你好,可以帮我P张图吗?
韩国版的求大神帮我P张图,看得有点下巴脱臼啊!哈哈哈哈哈哈哈~ 感觉照片拍得很尴尬,请大神P得更有动感 拍了跳跃照片,但内衣露出来一点,能帮忙去掉吗 不喜欢没穿制服的样子,请帮忙加上制服 希望背景 ...
- Unix和Windows文件格式转化
可能的原因有: 1)执行权限的问题 解决方法: chmod +x ***.py 2)python版本的问题 解决方法:在执行时或者在py文件中选择好对应的Python的版本 3)python文件格式的 ...
- 秒懂 this
一:全局执行 console.log(this); // Window 可以看出在全局作用域中 this 指向当前的全局对象 Window. 二:函数中执行 1.非严格模式中 function fun ...
- 【Tomcat】Tomcat + Memcached 实现session共享
概述 web项目中,Tomcat的访问量总是有限的,这时候就需要用到Tomcat集群,多个Tomcat的时候就要考虑Session共享的问题,这里介绍一种使用Memcached做Session共享的解 ...
- springMVC学习 七 视图解析器
在springMVC中,如果不配置视图解析器,会走默认的视图解析器,但是有时候配置视图解析器,还有一定的作用 <bean id="viewResolver" class=&q ...
- 3、iOS Xcode创建protocol(代理).h文件