Description

作为对奶牛们辛勤工作的回报,Farmer John决定带她们去附近的大城市玩一天。旅行的前夜,奶牛们在兴奋地

讨论如何最好地享受这难得的闲暇。 很幸运地,奶牛们找到了一张详细的城市地图,上面标注了城市中所有

L(2 <= L <= 1000)座标志性建筑物(建筑物按1..L顺次编号),以及连接这些建筑物的P(2 <= P <= 5000)条道路

。按照计划,那天早上Farmer John会开车将奶牛们送到某个她们指定的建筑物旁边,等奶牛们完成她们的整个

旅行并回到出发点后,将她们接回农场。由于大城市中总是寸土寸金,所有的道路都很窄,政府不得不把它们都

设定为通行方向固定的单行道。 尽管参观那些标志性建筑物的确很有意思,但如果你认为奶牛们同样享受穿行于

大城市的车流中的话,你就大错特错了。与参观景点相反,奶牛们把走路定义为无趣且令她们厌烦的活动。对于

编号为i的标志性建筑物,奶牛们清楚地知道参观它能给自己带来的乐趣值F_i (1 <= F_i <= 1000)。相对于奶牛们

在走路上花的时间,她们参观建筑物的耗时可以忽略不计。 奶牛们同样仔细地研究过城市中的道路。她们知道

第i条道路两端的建筑物 L1_i和L2_i(道路方向为L1_i -> L2_i),以及她们从道路的一头走到另一头所需要的

时间T_i(1 <= T_i <= 1000)。 为了最好地享受她们的休息日,奶牛们希望她们在一整天中平均每单位时间内获得

的乐趣值最大。当然咯,奶牛们不会愿意把同一个建筑物参观两遍,也就是说,虽然她们可以两次经过同一个建筑

物,但她们的乐趣值只会增加一次。顺便说一句,为了让奶牛们得到一些锻炼,Farmer John要求奶牛们参观至少2个

建筑物。 请你写个程序,帮奶牛们计算一下她们能得到的最大平均乐趣值。

solution

二分答案$mid$

记环上的边$e(u, v)$和点$ u $为,则$tmp = \sum u / \sum e$, 化为 $tmp *  \sum e - \sum u = 0$

如果$mid < tmp$, 则 $mid * \sum e - \sum u < 0$, 然后把 $l$ 记为$mid$继续二分, 不然就把 $r$ 记为$mid$ 继续二分

因为要使答案尽可能大, 所以我们希望找出一个环使得 $mid * \sum e - \sum u < 0$。

那么我们就可以在每次check时 构造一个新图, 每条边的权值为 $mid * e - u$。 然后找到一个负环即可check。

找负环用spfa实现

代码

 #include<cstring>
#include<queue>
#include<cstdio>
#include<algorithm>
#define rd read()
#define rep(i,a,b) for(register int i = (a); i <= (b); ++i)
#define per(i,a,b) for(register int i = (a); i >= (b); --i)
using namespace std; const int N = 1e3 + ;
const int M = 5e3 + ;
const int inf = ~0U >> ;
const double eps = 1e-; int n, m;
int head[N], tot, a[N], cnt[N], vis[N];
int head2[N], tot2;
double f[N]; queue<int> q; int read() {
int X = , p = ; char c = getchar();
for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
return X * p;
} struct edge {
int fr, nxt, to;
double val;
}e[M << ], E[M << ]; void add(int u, int v, double val) {
e[++tot].to = v;
e[tot].val = val;
e[tot].nxt = head[u];
e[tot].fr = u;
head[u] = tot;
} void add2(int u, int v, double val) {
E[++tot2].to = v;
E[tot2].val = val;
E[tot2].nxt = head2[u];
E[tot2].fr = u;
head2[u] = tot2;
} int ch(int x) {
return ((x + ) ^ ) - ;
} int spfa() {
f[] = ;
q.push();
for(int u; !q.empty();) {
u = q.front(); q.pop();
vis[u] = ;
for(int i = head2[u]; i; i = E[i].nxt) {
int nt = E[i].to;
double upd = f[u] + E[i].val;
if(f[nt] + eps < upd) continue;
cnt[nt] = cnt[u] + ;
if(cnt[nt] >= n) return ;
f[nt] = f[u] + E[i].val;
if(!vis[nt]) {vis[nt] = ; q.push(nt);}
}
}
return ;
} int check(double x) {
memset(head2, , sizeof(head2));
memset(cnt, , sizeof(cnt));
rep(i, , n) f[i] = inf;
tot2 = ;
rep(i, , tot) {
int u = e[i].fr, v = e[i].to;
double val = x * e[i].val - a[u];
add2(u, v, val);
}
return spfa();
} int main()
{
n = rd; m = rd;
rep(i, , n) a[i] = rd;
rep(i, , m) {
int u = rd, v = rd, val = rd;
add(u, v, val);
}
double l = , r = , mid, ans = ;
while(l + eps < r) {
mid = (l + r) / ;
if(check(mid)) ans = mid, l = mid;
else r = mid;
}
printf("%.2lf\n", ans);
}

POJ 3621Sightseeing Cows 0/1 分数规划的更多相关文章

  1. POJ - 2976 Dropping tests && 0/1 分数规划

    POJ - 2976 Dropping tests 你有 \(n\) 次考试成绩, 定义考试平均成绩为 \[\frac{\sum_{i = 1}^{n} a_{i}}{\sum_{i = 1}^{n} ...

  2. [USACO07DEC]Sightseeing Cows(负环,0/1分数规划)

    [USACO07DEC]Sightseeing Cows Description Farmer John has decided to reward his cows for their hard w ...

  3. POJ 2976 Dropping tests【0/1分数规划模板】

    传送门:http://poj.org/problem?id=2976 题意:给出组和,去掉对数据,使得的总和除以的总和最大. 思路:0/1分数规划 设,则(其中等于0或1) 开始假设使得上式成立,将从 ...

  4. poj 2976 Dropping tests 0/1分数规划

    0/1分数规划问题,用二分解决!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> # ...

  5. POJ2976 题解 0/1分数规划入门题 二分

    题目链接:http://poj.org/problem?id=2976 关于 0/1分数规划 参见 这篇博客 实现代码如下: #include <cstdio> #include < ...

  6. bzoj 3597: [Scoi2014]方伯伯运椰子 0/1分数规划

    3597: [Scoi2014]方伯伯运椰子 Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 144  Solved: 78[Submit][Status ...

  7. LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划

    题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...

  8. poj2728 Desert King【最优比率生成树】【Prim】【0/1分数规划】

    含[最小生成树Prim]模板. Prim复杂度为$O(n^2),适用于稠密图,特别是完全图的最小生成树的求解.   Desert King Time Limit: 3000MS   Memory Li ...

  9. [SDOI2017]新生舞会 0/1分数规划

    ---题面--- 题解: 0/1分数规划,,,但是竟然有诡异的精度问题???因为这个被卡了好久 中途还写过一次KM,,,结果陷入死循环,,,我大概是写了一个假KM,,,于是放弃KM,回来调费用流 这个 ...

随机推荐

  1. PPT的感想

    ①double:使用double类型的数值进行计算, 其结果是不精确的.因为double类型的数值占用64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差. 这个涉及到二进制 ...

  2. JAVA集合操作异常 ---------Collections.unmodifiableCollection

    1.问题原因 这两天在做开发的时候,在一个首页的列表哪里操作了ArrayList集合,在做递归删除的时候用的是Iterator对象(至于为什么用,来个链接https://blog.csdn.net/m ...

  3. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  4. Realtime Rendering 6

    [Realtime Rendering 6] 1.Lighting computations occur in two phases: 1)light phase. used to compute t ...

  5. React Mixins

    [React Mixins] ES6 launched without any mixin support. Therefore, there is no support for mixins whe ...

  6. 五、Singleton 单例模式

    需求:保证对象只创建一次 说明: 分为懒汉式.饿汉式,通过是否一开始就创建静态对象.饿汉式需要考虑线程并发的安全 懒汉式: public class Singleton { private stati ...

  7. python学习day6 for循环 字符串的内置方法

    1.for循环 和while相比 l=[1,2,3] i=0 while i <len(l) print(l[i]) i+=1 l=['a','b','c'] for item in l: pr ...

  8. dedecms迁站

    1  后台>系统>备份数据库 2  下载“所有(强调一下是所有:包括整站程序与备份的数据)”原站的数据,整个站点 3  将下载下来的所有数据上传到新空间 4  删除install目录下的i ...

  9. 八:python 对象类型详解四:字典

    一:字典通识: 1,字典通过键而不是偏移量来读取: 2,字典是任意对象的无序集合: 3,字典可变长.异构.任意嵌套: 4,字典属于可变映射类型: 5,对象引用表(散列表): 二:实际应用中的字典: 1 ...

  10. kafka NoNode错误

    报错 bin/kafka-run-class.sh kafka.tools.ConsumerOffsetChecker --zookeeper localhost:2181 --group=app-t ...