APIO 2017 商旅 洛谷3778
Description
在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴。你被这个城市发达而美丽的市场所
深深吸引,决定定居于此,做一个商人。科巴有个集市,集市用从1到N的整数编号,集市之间通过M条单向道路连
接,通过每条道路都需要消耗一定的时间。在科巴的集市上,有K种不同的商品,商品用从1到K的整数编号。每个
集市对每种商品都有自己的定价,买入和卖出商品的价格可以是不同的。并非每个集市都可以买卖所有的商品:一
个集市可能只提供部分商品的双向交易服务;对于一种商品,一个集市也可能只收购而不卖出该商品或只卖出而不
收购该商品。如果一个集市收购一种商品,它收购这种商品的数量是不限的,同样,一个集市如果卖出一种商品,
则它卖出这种商品的数量也是不限的。为了更快地获得收益,你决定寻找一条盈利效率最高的环路。环路是指带着
空的背包从一个集市出发,沿着道路前进,经过若干个市场并最终回到出发点。在环路中,允许多次经过同一个集
市或同一条道路。在经过集市时,你可以购买或者卖出商品,一旦你购买了一个商品,你需要把它装在背包里带走
。由于你的背包非常小,任何时候你最多只能持有一个商品。在购买一个商品时,你不需要考虑你是否有足够的金
钱,但在卖出时,需要注意只能卖出你拥有的商品。从环路中得到的收益为在环路中卖出商品得到的金钱减去购买
商品花费的金钱,而一条环路上消耗的时间则是依次通过环路上所有道路所需要花费的时间的总和。环路的盈利效
率是指从环路中得到的收益除以花费的时间。需要注意的是,一条没有任何交易的环路的盈利效率为0。你需要求
出所有消耗时间为正数的环路中,盈利效率最高的环路的盈利效率。答案向下取整保留到整数。如果没有任何一条
环路可以盈利,则输出0。
Input
第一行包含3个正整数N,M和K,分别表示集市数量、道路数量和商品种类数量。
接下来的N行,第行中包含2K个整数描述一个集市Bi,1 Si,1 Bi,2 Si,2…Bik Si,k。
对于任意的1<=j<=k,整数和分别表示在编号为的集市上购买、卖出编号为的商品时的交易价格。
如果一个交易价格为-1,则表示这个商品在这个集市上不能进行这种交易。
接下来M行,第行包含3个整数Vp,Wp和Tp,表示存在一条从编号为Vp的市场出发前往编号为Wp的市场的路径花费Tp分钟。
1<=N<=100,1<=M<=9900。
如果在编号为的集市i中,编号为j的商品既可以购买又可以卖出
对于编号为P(1<=P<=M)的道路,保证Vp<>Wp且1<=Tp<=10^7
不存在满足1<=P < Q<=M的P,Q,使得(Vp,Wp)=(Vq,Wq) 。
输出包含一个整数,表示盈利效率最高的环路盈利效率,答案向下取整保留到整数。
如果没有任何一条环路可以盈利,则输出0。
Sample Input
4 5 2
10 9 5 2
6 4 20 15
9 7 10 9
-1 -1 16 11
1 2 3
2 3 3
1 4 1
4 3 1
3 1 1
Sample Output
2
在样例中,我们考虑下面两条环路,“1 - 2 - 3 - 1” 和 “1 - 4 - 3 - 1”。
考虑环路 “1 - 2 - 3 - 1” :这条环路消耗的总时间是 分钟。在这条环路中,
最佳的交易方式是:在编号为 1 的集市中购买编号为 2 的商品(花费的金钱为 5 );在编号
为 2 的集市中卖出编号为 2 的商品(得到的金钱为 15 ),然后立即购买编号为 1 的商品
(花费的金钱为 6 );带着编号为 1 的商品经过编号为 3 的集市,在回到编号为 1 的城市后
卖出(得到的金钱为 9 )。在这个环路中,总盈利为13。 这个环路的盈利效率为13/7 ,向下取整后为 1 。
考虑环路 “1 - 4 - 3 - 1” :这条环路消耗的总时间是 分钟。在这条环路中,
最佳的交易方式是:在编号为 1 的集市中购买编号为 2 的商品(花费的金钱为 5 );在编号
为 4 的集市中卖出编号为 2 的商品(得到的金钱为 11 );然后经过编号为 3 的集市回到编
号为 1 的城市。在这个环路中,总盈利为 6。 这个环路的盈利效率为6/3 ,向下取整后为 2 。
综上所述,盈利效率最高的环路的盈利效率为 2 。
01分数规划中的最优比例生成环问题,先floyed跑出最短路,在更新出最大收益,二分答案,spfa炮正环、
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define int long long using namespace std;
const int MAXN = ;
const int inf = 0x3f3f3f3f; int n,m,k,s[MAXN][MAXN],b[MAXN][MAXN];
int dp[MAXN][MAXN],map[MAXN][MAXN],ans;
int cnt[MAXN];
double dis[MAXN];
bool vis[MAXN]; inline bool check(double xx){
queue<int> q;
for(int i=;i<=n;i++) q.push(i),vis[i]=,dis[i]=,cnt[i]=;
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=;
for(int i=;i<=n;i++)
if(dp[x][i]!=inf && i!=x){
int now=map[x][i]-dp[x][i]*xx;
if(dis[i]<=dis[x]+now){
dis[i]=dis[x]+now;
if(!vis[i]){
vis[i]=;
q.push(i);
if(++cnt[i]>=n) return true;
}
}
}
}
return false;
} inline void floyed(){
for(register int i=;i<=n;i++)
for(register int j=;j<=n;j++)
for(register int o=;o<=n;o++)
dp[i][j]=min(dp[i][j],dp[i][o]+dp[o][j]);
for(register int i=;i<=n;i++) dp[i][i]=;
} inline void DP(){
for(register int i=;i<=n;i++)
for(register int j=;j<=n;j++){
if(dp[i][j]!=inf && (i!=j))
for(register int o=;o<=k;o++){
if(b[i][o]==- || s[j][o]==-) continue;
map[i][j]=max(s[j][o]-b[i][o],map[i][j]);
}
}
// for(register int i=1;i<=n;i++){
// for(register int j=1;j<=n;j++)
// cout<<map[i][j]<<" ";
// cout<<endl;
// }
} inline void update(){
double l=0.0,r=1e9;
while(r-l>1e-){
double mid=(l+r)/;
if(check(mid)) l=mid;
else r=mid;
}
printf("%lld",(int)r);
} signed main(){
memset(dp,0x3f,sizeof(dp));
scanf("%lld%lld%lld",&n,&m,&k);
for(register int i=;i<=n;i++)
for(register int j=;j<=k;j++)
scanf("%lld%lld",&b[i][j],&s[i][j]);
for(register int i=;i<=m;i++){
int x,y,z;
scanf("%lld%lld%lld",&x,&y,&z);
dp[x][y]=z;
}floyed();DP();update();
return ;
}
APIO 2017 商旅 洛谷3778的更多相关文章
- BZOJ4898 & BZOJ5367 & 洛谷3778:[APIO2017]商旅——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4898 https://www.lydsy.com/JudgeOnline/problem.php? ...
- 洛谷3778 [APIO2017]商旅
题目:https://www.luogu.org/problemnew/show/P3778 一看就是0/1分数规划.但不能直接套模板,因为有个商品种类的限制. 考虑从a买在b卖,商品种类根本没用,关 ...
- [APIO 2017] 商旅
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=5367 [算法] 很明显的分数规划问题 预处理从一个点走到另一个点所获最大利润和最短路 ...
- [CodePlus 2017 11月赛&洛谷P4058]木材 题解(二分答案)
[CodePlus 2017 11月赛&洛谷P4058]木材 Description 有 n棵树,初始时每棵树的高度为 Hi ,第 i棵树每月都会长高 Ai.现在有个木料长度总量为 S的订单, ...
- 2017普及组D1T3 洛谷P3956 棋盘
2017普及组D1T3 洛谷P3956 棋盘 原题 题目描述 有一个m×m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在 ...
- 洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心)
洛谷P1484 种树&洛谷P3620 [APIO/CTSC 2007]数据备份 题解(堆+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/132 ...
- 洛谷 P3951 NOIP 2017 小凯的疑惑
洛谷 P3951 NOIP 2017 小凯的疑惑 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付 ...
- 2017提高组D1T1 洛谷P3951 小凯的疑惑
洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...
- 【洛谷P3749】[六省联考2017]寿司餐厅(网络流)
洛谷 题意: 给出\(n\)份寿司,现可以选取任意多次连续区间内的寿司,对于区间\([l,r]\),那么贡献为\(\sum_{i=l}^r \sum_{j=i}^rd_{i,j}\)(对于相同的\(d ...
随机推荐
- delphi和C# 保存exe文件到数据库
Delphi: procedure TForm1.Button1Click(Sender: TObject); var strSQL, sfilename: string; MStream: TMem ...
- safari浏览器中获取指定时间的毫秒数
最近在项目中,发现时间转换,在firefox和chrome中可以正确的显示,但是在Safari中显示NaN.在网上查了下,发现Safari不支持 YYYY-MM-DD HH:MM:SS 这个时间格式, ...
- 关于axios中post请求提交后变成get的问题
这个问题归结于自己的不细心,如下图. 头疼了好久,才发现是自己多写了一个s,在此记录一下.
- bzoj 2084
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2084 这道题很容易想到就是一个变种的最长回文字串, 不过回文的规则变成了s[i + p[i] ...
- sqlmap用户手册详解【实用版】
网上的sqlmap教程很多,但是我自己备忘小笔记都是在我的电脑上存着了,万一我要出去玩的时候,有点忘了,还得再百度翻翻,还不如发到我自己知乎上,忘了立马一看就记着了.虽说我的sqlmap备忘小笔记汇总 ...
- Openstack组件部署 — Nova_Install and configure a compute node
目录 目录 前文列表 Prerequisites 先决条件 Install and configure a compute node Install the packages Edit the etc ...
- Linux下使用java获取cpu、内存使用率
原文地址:http://www.voidcn.com/article/p-yehrvmep-uo.html 思路如下:Linux系统中可以用top命令查看进程使用CPU和内存情况,通过Runtime类 ...
- linux top监控的使用
b : toggle highlight x : toggle sort row highlight shift + < > : switch sort row
- cesium中divPoint展示数据
cesium中divPoint展示数据 在用点击面获取位置信息的时候,会弹出一个divPoint框,用来展示这个面的属性信息:或者位置信息. 代码如下: var handlerClick = new ...
- node.js 中的 fs (文件)模块
记录 fs 模块的方法及使用 1. fs.stat 获取文件大小,创建时间等信息 // 引入 fs 模块 const fs = require('fs'); fs.stat('01.fs.js', ( ...