BZOJ 4898: [Apio2017]商旅 题解

BZOJ链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4898

题目PDF链接:https://files.cnblogs.com/files/winmt/merchant%28zh_CN%29.pdf

题解PDF链接:https://files.cnblogs.com/files/winmt/APIO2017-%E5%95%86%E6%97%85%E9%A2%98%E8%A7%A3.pdf

参考代码:(因为官方数据并没有出来,所以我的标程正确性只能说90%正确吧,毕竟对拍过。)

#include<bits/stdc++.h>
using namespace std;

const int N = 105;
const int K = 1005;
const long long INF = 1e10;
const int MAX_ANS = 1e9 + 1;

int n, m, items;
int buy[N][K], sell[N][K];
long long dist[N][N], profit[N][N];
long long adj[N][N], adj2[N][N];

inline bool check(long long x) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (dist[i][j] == INF) {
                adj[i][j] = -INF;
            } else {
                adj[i][j] = profit[i][j] - dist[i][j] * x;
                adj[i][j] = max(-INF, adj[i][j]);
            }
        }
        adj[i][i] = -INF;
    }
    long long res = -INF;
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                adj[i][j] = max(adj[i][j], adj[i][k] + adj[k][j]);
                res = max(res, adj[i][i]);
                if (res >= 0) {
                    return true;
                }
                adj[i][j] = min(adj[i][j], INF);
                adj2[i][j] = adj[i][j];
            }
        }
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                adj2[i][j] = max(adj2[i][j], adj2[i][k] + adj2[k][j]);
                if (adj2[i][j] > adj[i][j]) {
                    return true;
                }
            }
        }
    }
    return false;
}

int main() {
    ios :: sync_with_stdio(false);
    cin >> n >> m >> items;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= items; j++) {
            cin >> buy[i][j] >> sell[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            dist[i][j] = INF;
        }
        dist[i][i] = 0;
    }
    for (int i = 1; i <= m; i++) {
        int u, v, w; cin >> u >> v >> w;
        dist[u][v] = min(dist[u][v], (long long) w);
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            profit[i][j] = 0;
            for (int k = 1; k <= items; k++) {
                if (buy[i][k] == -1 || sell[j][k] == -1) continue;
                profit[i][j] = max(profit[i][j], (long long) sell[j][k] - (long long) buy[i][k]);
            }
        }
    }
    long long l = 1, r = MAX_ANS;
    long long ans = 0;
    while (l <= r) {
        long long mid = (l + r) >> 1;
        if (check(mid)) {
            l = mid + 1;
            ans = mid;
        } else {
            r = mid - 1;
        }
    }
    cout << ans << "\n";
    return 0;
}

这题BZOJ上数据是我造的,有任何怀疑数据的问题,可以联系我!在下方评论区扔出,谢谢!

时间: 2024-10-19 08:53:41

BZOJ 4898: [Apio2017]商旅 题解的相关文章

APIO2017 商旅

目录 APIO2017 商旅 题意 题解 Code: APIO2017 商旅 题目传送门 题意 给出一个\(N\)个点\(M\)条边的有向图,你可以在每个点对于一些特定的商品进行买卖.一共有\(K\)种商品,在每一个点,每一种商品都有一个买入值\(B_i\)和一个卖出值\(S_i\).每一条边有一个边权\(T_i\),表示经过这条边的时间.定义一条环路的盈利效率为在这条环路上能够获得的利益最大值除以在这条环路上花费的时间,求盈利效率最大的一条环路. \((1 \leq N \leq 100 ,

矩阵乘法专题1——bzoj 1297 [SCOI2009] 迷路题解

题目链接 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e:2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分) 分析: 首先,问题其实就是转化成,进行若干次操作1,然后进行操作2 还要找到一个判别标准,来评判较优的状态(贪心) 每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大 状态表示: 简单的,一个状态可以表示为串A的位置.串B

BZOJ 1~10 精简题解

从这星期起,我开始了怒刷BZOJ的旅程.这几天刷了10道题(由于"档期"的原因,所以有几道题没打完-..捂脸--..) 精简题解: 1000 A+B Problem --.. [BeiJing2006]狼抓兔子 裸的网络流,不过data有点大...... 哈,这图的性质太好了,就是一个平面图额,并且也很容易转化成对偶图,So--spfa怒跑之-- [FJOI2007]轮状病毒 Matrix-tree定理 不过,这道题有个线性递推式:f[n] = 3 * f[n - 1] – f[I -

bzoj 3198: [Sdoi2013]spring 题解

[原题] 3198: [Sdoi2013]spring Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 253  Solved: 95 Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT [题解]这道题明明是水题,坑了我两天!!!真是伤心.发现哈希都不熟练了. 首先很容易想到是2^6枚举01状态,使得1

bzoj 3246 [Ioi2013] Dreaming 题解

[原题] 3246: [Ioi2013]Dreaming Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 194  Solved: 68 Description Serpent(水蛇)生活的地方有N个水坑,编号为0,...,N - 1,有M条双向小路连接这些水坑.每两个水坑之间至多有一条路径(路径包含一条或多条小路)相互连接,有些水坑之间根本无法互通(即M ≤ N-1 ).Serpent走过每条小路需要一个固定的天数,不同的小路需要的天数可能不同.

splay专题复习——bzoj 3224 &amp; 1862 &amp; 1503 题解

[前言]快要省选二试了.上次去被虐出翔了~~这次即便是打酱油,也要打出风采!于是暂停新东西的学习,然后开始复习以前的知识,为骗分做准备.PS:区间翻转的暂时跳过,就算学了也来不及巩固了. [BZOJ3224] 3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1477  Solved: 570 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入

bzoj 3333: 排队计划 题解

[原题] 3333: 排队计划 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 161  Solved: 71 [Submit][Status] Description Input Output Sample Input 6 2 160 163 164 161 167 160 2 3 Sample Output 6 3 1 HINT Source wyx528命题 [分析]简述一下题目.N个数排成一列,每次指定一个位置P,然后把P~N中所有身高小

BZOJ 1191 超级英雄 Hero 题解

BZOJ 1191 超级英雄 Hero 题解 Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰.为了增加节目的趣味性并适当降低难度,主持人总提供给选手几个“锦囊妙计”,比如求助现场观众,或者去掉若干个错误答案(选择题)等等. 这里,我们把规则稍微改变一下.假设主持人总共有m道题,选手有n种不同的“锦囊妙计”

BZOJ 4103~4105 THUSC2015 题解

T1:BZOJ 4013 xor 题目大意:给定一个长度为n的数列a和一个长度为m的数列b,给定矩阵A,令Ai,j=ai⊕bj,q次询问某个子矩形里的k大值 n≤1000,m≤3?105,q≤500 刚看到这题的时候我发现我不会,看到数据范围的时候我发现出题人也不会-- 如果n=1,那么我们对这m个数建立可持久化Trie树,每次询问的时候查询异或a1的k大值即可 那么现在n=1000,我们只需要把这2000棵Trie树放在一起跑即可 时间复杂度O(m?32+n?q?32) 二分答案会T掉. #i