[USACO 2001 OPEN] 地震

好像是 01 分数规划 板子

列出式子 (F - ∑Ci) / (∑Ti)

设当前二分的答案为 ans

若 ans ≤ (F - ∑Ci) / (∑Ti)
则说明 ans 可以再增大

那我们二分边界调整的条件就有了

就是当 F - (∑ans*Ti + ∑Ci) ≥ 0



代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cctype>
#include <cstdio>
using namespace std;

const int MAXN = 405, MAXM = 10005;

struct EDGE {
    int x, y, c, t;
    double hf;
    bool operator < (const EDGE& b) const {
        return hf < b.hf;
    }
}edge[MAXM];
int n, m, f;
int fa[MAXN];

inline void clearfa() {
    for (int i = 1; i <= n; ++i) fa[i] = i;
}
int findfa(int x) {
    return ((fa[x] == x) ? (x) : (fa[x] = findfa(fa[x])));
}
inline bool link(int x, int y) {
    register int fx = findfa(x), fy = findfa(y);
    if (fx == fy) return false;
    fa[fx] = fy;
    return true;
}
inline bool chk(double mid) {
    register double ans = 0.0;
    clearfa();
    for (int i = 1; i <= m; ++i) edge[i].hf = edge[i].t * mid + edge[i].c;
    sort(edge + 1, edge + m + 1);
    for (int i = 1; i <= m; ++i) {
        if (link(edge[i].x, edge[i].y)) {
            ans += edge[i].hf;
        }
    }
    return ((ans - (double)f) <= 0.0);
}
inline void hfs(double l, double r) {
    register double mid = 0.0;
    while ((r - l) > 1e-7) {
        mid = ((l + r) / 2.0);
        if (chk(mid)) l = mid;
        else r = mid;
    }
    printf("%.4lf\n", l);
}

int main() {
    scanf("%d%d%d", &n, &m, &f);
    for (int i = 1; i <= m; ++i) {
        scanf("%d%d%d%d", &edge[i].x, &edge[i].y, &edge[i].c, &edge[i].t);
    }
    hfs(0, 2000000000.0);
    return 0;
}

原文地址:https://www.cnblogs.com/xcysblog/p/9859966.html

时间: 2024-10-23 08:15:27

[USACO 2001 OPEN] 地震的相关文章

[USACO 2001 OPEN]地震 (二分答案+最小生成树)

题面:[USACO 2001 OPEN]地震 \(solution:\) \(code:\) #include<iostream> #include<cstdio> #include<iomanip> #include<algorithm> #include<cstring> #include<cstdlib> #include<ctime> #include<cmath> #include<vector

【USACO 2009 JAN】地震造成的破坏Earthquake Damage(DFS)

题目描述 农夫John的农场遭受了一场地震.有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路径都还能使用. FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1..P,C(1 <= C <= 100,000)条双向路径连接这些牛棚,编号为1..C,路径i连接牛棚a_i和b_i (1 <= a_i<= P;1 <= b_i <= P),路径可能连接a_i到它自己,两个牛棚之间可能有多条路径.农庄在编号为1的牛棚.N (1 <= N <=

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

【USACO】草地排水

Drainage Ditches 草地排水 usaco 4.2.1描述在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一套排水系统来使贝茜的草地免除被大水淹没的烦恼(不用担心,雨水会流向附近的一条小溪).作为一名一流的技师,农夫约翰已经在每条排水沟的一端安上了控制器,这样他可以控制流入排水沟的水流量.农夫约翰知道每一条排水沟每分钟可以流过的水量,和排水系统的准确布局(起点为水潭而终点为小

[USACO 08JAN]Telephone Lines

Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of the cables required to connect his farm to the phone system. There are N (1 ≤ N ≤ 1,000) forlorn t

HDU 2189 悼念512汶川大地震遇难同胞——来生一起走(母函数或完全背包)

悼念512汶川大地震遇难同胞--来生一起走 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3773    Accepted Submission(s): 1913 Problem Description 妈妈你别哭泪光照亮不了我们的路让我们自己慢慢的走 妈妈我会记住你和爸爸的模样记住我们的约定来生一起走 上面这首诗节选自一位诗人纪念遇难

COGS 696. [IOI1996][USACO 2.3] 最长前缀

★   输入文件:prefix.in   输出文件:prefix.out   简单对比时间限制:1 s   内存限制:128 MB 描述 USACO 2.3.1 IOI96 在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的.生物学家对于把长的序列分解成较短的序列(即元素)很感兴趣. 如果一个集合 P 中的元素可以通过串联(元素可以重复使用,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素.元素不一定要全部出现(如下例中B

USACO prefix TrieTree + DP

/* ID:kevin_s1 PROG:prefix LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib>

【USACO 1.3.4】牛式

[題目描述 ] 下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式. * * * x * * ---------- * * * * * * ---------- * * * * 数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0. 注意一下在美国的学校中教的"部分乘积",第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积. 写一个程序找出所有的牛式. [格式] INPUT FORMAT: (f