BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4898
https://www.lydsy.com/JudgeOnline/problem.php?id=5367
https://www.luogu.org/problemnew/show/P3778
在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴。你被这个城市发达而美丽的市场所深深吸引,决定定居于此,做一个商人。科巴有个集市,集市用从1到N的整数编号,集市之间通过M条单向道路连接,通过每条道路都需要消耗一定的时间。在科巴的集市上,有K种不同的商品,商品用从1到K的整数编号。每个集市对每种商品都有自己的定价,买入和卖出商品的价格可以是不同的。并非每个集市都可以买卖所有的商品:一个集市可能只提供部分商品的双向交易服务;对于一种商品,一个集市也可能只收购而不卖出该商品或只卖出而不收购该商品。如果一个集市收购一种商品,它收购这种商品的数量是不限的,同样,一个集市如果卖出一种商品,则它卖出这种商品的数量也是不限的。为了更快地获得收益,你决定寻找一条盈利效率最高的环路。环路是指带着空的背包从一个集市出发,沿着道路前进,经过若干个市场并最终回到出发点。在环路中,允许多次经过同一个集市或同一条道路。在经过集市时,你可以购买或者卖出商品,一旦你购买了一个商品,你需要把它装在背包里带走。由于你的背包非常小,任何时候你最多只能持有一个商品。在购买一个商品时,你不需要考虑你是否有足够的金钱,但在卖出时,需要注意只能卖出你拥有的商品。从环路中得到的收益为在环路中卖出商品得到的金钱减去购买商品花费的金钱,而一条环路上消耗的时间则是依次通过环路上所有道路所需要花费的时间的总和。环路的盈利效率是指从环路中得到的收益除以花费的时间。需要注意的是,一条没有任何交易的环路的盈利效率为0。你需要求出所有消耗时间为正数的环路中,盈利效率最高的环路的盈利效率。答案向下取整保留到整数。如果没有任何一条环路可以盈利,则输出0。
将如此之长的题面读完之后,你惊奇的发现,这题竟然是一道水题!
(虽然水但是我竟然发现我floyd和spfa都能写错我可能是OI之耻吧……)
那些乱七八糟的货物倒卖实际上可以总结为i~j,我倒卖的最大价值为w权,我经过的最短时间为t权,求sigma(w)/sigma(t)的最大值。
这明显是0/1分数规划套路,二分答案然后找正环就行了(不敢找负环怕爆ll……不知道可不可行。)
当然别忘了对于没法到达的(i,j),其不存在边,如果你用邻接矩阵的话,记的用什么方法判掉这些边。
(另外自己不能向自己倒卖商品)
#include<cmath>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
const int K=;
const int INF=1e9;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
int n,m,k;
int b[N][K],s[N][K],tim[N][N],cas[N][N],inq[N];
ll dis[N][N],big[N];
bool vis[N];
queue<int>q;
bool spfa(){
while(!q.empty())q.pop();
for(int i=;i<=n;i++)big[i]=vis[i]=inq[i]=;
for(int i=;i<=n;i++)q.push(i),vis[i]=inq[i]=;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=;
for(int v=;v<=n;v++){
if(big[v]-dis[u][v]<=big[u]){
big[v]=big[u]+dis[u][v];
if(!vis[v]){
inq[v]++;vis[v]=;
if(inq[v]>n)return ;
q.push(v);
}
}
}
}
return ;
}
inline bool pan(int w){
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=(ll)cas[i][j]-(ll)w*tim[i][j];
return spfa();
}
int erfen(int l,int r){
while(l<r){
int mid=(l+r+)>>;
if(pan(mid))l=mid;
else r=mid-;
}
return l;
}
int main(){
n=read(),m=read(),k=read();
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
b[i][j]=read(),s[i][j]=read();
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
tim[i][j]=INF,cas[i][j]=-INF;
tim[i][i]=;
}
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
tim[u][v]=min(tim[u][v],w);
}
for(int l=;l<=n;l++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(tim[i][j]-tim[i][l]>tim[l][j])
tim[i][j]=tim[i][l]+tim[l][j];
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j&&tim[i][j]!=INF){
cas[i][j]=;
for(int l=;l<=k;l++)
if(b[i][l]>=&&s[j][l]>=&&b[i][l]<s[j][l])
cas[i][j]=max(cas[i][j],s[j][l]-b[i][l]);
}
printf("%d\n",erfen(,INF));
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解的更多相关文章
- 洛谷3778 [APIO2017]商旅
题目:https://www.luogu.org/problemnew/show/P3778 一看就是0/1分数规划.但不能直接套模板,因为有个商品种类的限制. 考虑从a买在b卖,商品种类根本没用,关 ...
- 洛谷P3778 [APIO2017]商旅——01分数规划
题目:https://www.luogu.org/problemnew/show/P3778 转化有点技巧: 其实直接关注比率的上下两项,也就是盈利和时间: 通过暴枚和 floyd 可以处理出两两点间 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- 韩国KT软件NB-IOT开发记录V150(2)FOTA差分包生成
1. 生成差分包
- 【原创】MyEclipse反编译添加jadclipse_3.3.0 曲折的完美解决
本人QQ:9715234 (java屌丝一枚) 共三部分 一.下载两个文件exe和jar 1.http://nchc.dl.sourceforge.net/project/jadclipse/jadc ...
- python中的class正确用法
class Dog: def __init__(self, name): self.name = name self.tricks = [] # creates a new empty list fo ...
- UnityShader - 模拟动态光照特效
模型贴片 + 特效Shader = 动态光照特效 效果是这样的: 做法简单粗暴,直接使用模型贴片: shader上使用了noise只是提供一种思路,也有更简单的方法代替
- C 数数位 while循环
#include <stdio.h> int main(int argc, char **argv) { //定义两个变量 x n 把n初始化 int x; int n=0; //输入x ...
- a链接传参的方法
//获取分案编号 var hrefVal=window.location.href.split("?")[1]; //得到id=楼主 //console.log(hrefVal+& ...
- 孤荷凌寒自学python第八十二天学习爬取图片2
孤荷凌寒自学python第八十二天学习爬取图片2 (完整学习过程屏幕记录视频地址在文末) 今天在昨天基本尝试成功的基础上,继续完善了文字和图片的同时爬取并存放在word文档中. 一.我准备爬取一个有文 ...
- 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数
题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...
- visionpro吧-百度贴吧
Halcon,Visionpro视频教程,观看下载地址:http://www.211code.com
- jQuery 调用后台方法(net)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs ...