APIO2017 商旅

目录

  • APIO2017 商旅
  • 题意
  • 题解
  • Code:

APIO2017 商旅

题目传送门

题意

给出一个\(N\)个点\(M\)条边的有向图,你可以在每个点对于一些特定的商品进行买卖。一共有\(K\)种商品,在每一个点,每一种商品都有一个买入值\(B_i\)和一个卖出值\(S_i\)。每一条边有一个边权\(T_i\),表示经过这条边的时间。定义一条环路的盈利效率为在这条环路上能够获得的利益最大值除以在这条环路上花费的时间,求盈利效率最大的一条环路。
\((1 \leq N \leq 100 , 1 \leq M \leq 9900 , 1 \leq K \leq 1000 , 1 \leq B_i , S_i \leq 10^9 , 1 \leq T_i \leq 10^7)\)

题解

首先我们可以得出盈利效率的计算方法是\(ans=\frac{\sum Val}{\sum T}\),然后我们会发现这个题目就会和BZOJ的最小圈那道题目有点类似了。继续考虑到这道题目中\(N\)的范围比较的小,所以我们可以考虑稍微暴力一些的方法。实际上,对于仍以两个点\(u\)、\(v\),如果我们强制让这两个点分别为某一次交易的起点和终点,那么这一次交易的利益就是确定了的,所以我们可以之间从\(u\)向\(v\)连一条\(val\)为这次交易的利益(如果是负的就不用连了),\(T\)为这两点之间的最短路的边,然后我们就可以转化成最小圈那题做了。

Code:

#include<bits/stdc++.h>
using namespace std;
const int M=10005;
const int N=105;
typedef long long ll;
#define int ll
typedef pair<ll,int>P;
#define fi first
#define se second
#define mk make_pair

int n,m,nk,tot;
ll B[N][N*30],S[N][N*30];
ll dis[N][N],Mp[N][N];
struct edge {
  int to,nxt;
  ll w;
}E[M];
int head[N];
void Addedge(int u,int v,ll w) {
  E[++tot].to=v;E[tot].nxt=head[u];head[u]=tot;E[tot].w=w;
}

queue<int>Q;
ll di[N],inq[N],cnt[N],vis[N];
int Spfa() {
  while(!Q.empty()) Q.pop();
  memset(cnt,0,sizeof cnt);memset(di,0,sizeof di);
  for(int i=1;i<=n;i++) Q.push(i),inq[i]=1;
  while(!Q.empty()) {
    int o=Q.front();Q.pop();
    cnt[o]++;
    if(cnt[o]>n) return 1;
    inq[o]=0;
    for(int i=head[o];~i;i=E[i].nxt) {
      int to=E[i].to;
      if(di[to]<=di[o]+E[i].w) {
    di[to]=di[o]+E[i].w;
    if(!inq[to]) {
      inq[to]=1;
      Q.push(to);
    }
      }
    }
  }
  return 0;
}

int Check(ll ret) {
  memset(head,-1,sizeof head);
  tot=0;
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=n;j++) {
      if(i==j||Mp[i][j]<0) continue;
      Addedge(i,j,Mp[i][j]-ret*dis[i][j]);
    }
  }
  return Spfa();
}

signed main() {
  scanf("%lld%lld%lld",&n,&m,&nk);
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=nk;j++) {
      scanf("%lld%lld",&B[i][j],&S[i][j]);
    }
  }
  memset(dis,0x3f,sizeof dis);
  for(int i=1,u,v;i<=m;i++) {
    ll t;
    scanf("%lld%lld%lld",&u,&v,&t);
    dis[u][v]=min(dis[u][v],t);
  }
  for(int k=1;k<=n;k++) {
    for(int i=1;i<=n;i++) {
      for(int j=1;j<=n;j++) {
    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
      }
    }
  }
  for(int i=1;i<=n;i++) {
    for(int j=1;j<=n;j++) {
      if(dis[i][j]>1e10||i==j) continue;
      Mp[i][j]=0;
      for(int k=1;k<=nk;k++) {
    if(B[i][k]==-1||S[j][k]==-1) continue;
    Mp[i][j]=max(Mp[i][j],S[j][k]-B[i][k]);
      }
    }
  }
  ll L=0,R=1e9,ans=0;
  while(L<=R) {
    ll Mid=(L+R)>>1;
    if(Check(Mid)) L=Mid+1,ans=Mid;
    else R=Mid-1;
  }
  printf("%lld\n",ans);
  return 0;
}

原文地址:https://www.cnblogs.com/Apocrypha/p/9885043.html

时间: 2024-10-29 15:35:41

APIO2017 商旅的相关文章

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 参考代码:(因为官方数据并没有出来,所以我的标程

【bzoj4898】[Apio2017]商旅 Floyd+分数规划+Spfa

题目描述 有n个点.m条边.和k种商品.第$i$个点可以以$B_{ij}$的价格买入商品$j$,并以$S_{ij}$的价格卖出.任何时候只能持有一个商品.求一个环,使得初始不携带商品时以某种交易方式走过一圈所得的利润/路径长度(向下取整)最大. 输入 第一行包含3个正整数N,M和K,分别表示集市数量.道路数量和商品种类数量. 接下来的N行,第行中包含2K个整数描述一个集市Bi,1 Si,1 Bi,2 Si,2...Bik Si,k. 对于任意的1<=j<=k,整数和分别表示在编号为的集市上购买

YCB 的暑期计划

前言 YCB现在很弱(TAT) 暑假有一个月,赶快狂补一下. 大概的计划如下: 首先前期会以数据结构为主,毕竟代码能力太弱,涉及内容:线段树分治.二进制分组.KD-Tree. 等数据结构做到没有智商的时候加入一波数论,内容为 杜教筛.min_25筛. 然后中途小清新一下,做一些 组合博弈与构造题. 接着继续练代码能力,顺便学一些神奇的暴力:启发式合并.dsu on tree . 然后图论也忘的差不多了,就回过头去学点新东西,大概会有spfa判负环.0/1分数规划.差分约束. 估计这个时候也没有什

分数规划小结

https://www.zybuluo.com/ysner/note/1262173 定义 给定数列\(\{a\},\{b\}\),求解一组数列\(\{x\}\)(\(x_i=\{0,1\}\)) 使得\[\frac{\sum_{i=1}^na_i*x_i}{\sum_{i=1}^nb_i*x_i}\] 最大化. 方法 主要是二分答案. 设二分出的值为\(mid\), 则应有\[\frac{\sum_{i=1}^na_i*x_i}{\sum_{i=1}^nb_i*x_i}\geq mid\] 化

【游记】CTSC&amp;APIO2017

GDOI回来不到两天就前往北京参加CTSC和APIO. CTSC Day1 [考试] T1一道神奇的题,很快想到O(n2)做法,感觉ctsc题目难度应该很大,就没马上想着出正解(事实上这届CTSC偏水-233) T2给带边权树加一条指定边权边,使最大的两点间最短路最小.虽然是最大值最小问题但是考虑了几次二分都不靠谱--考虑枚举环暴力判断O(n4)但是程序好像相当难写--好像要链剖树型DP总之各种复杂. T3看到概率两字就没往下看了--这是我这场比赛最痛心的地方! 回去考虑T1,画出表来想了很久发

重绘商旅逻辑架构有感

商旅系统一做就是三年,这期间系统由初建到流畅运行,架构上经历了许多次的重构和整理.重新回首,整理一下系统,谈谈自己对逻辑架构的设计实践的一些感想. 商旅系统前后逻辑图如下所示: 这张图是商旅系统最新整理系统逻辑图,与最初相比,有比较多有趣的地方,值得评鉴. 分层架构的清晰. 原有三层的分层架构依旧保留,进行了更进一步的抽象,比如系统管理平台和作业平台细分内容没有进行展示:将应用服务层CC的子系统框架模糊化,定义CC作业平台为渠道端子系统,其服务层和支撑层是子系统内部技术架构,不在总体逻辑架构图展

搜车票.乐游商旅网

乐游商旅网成立于2013年,是成都乐游商旅科技有限公司旗下全力打造的商旅服务网络平台,通过移动终端.互联网,整合线上.线下资源,为客户提供一站式的商旅预订服务 . 乐游商旅网目前可以提供***服务,可以覆盖全国所有城市火车票的在线代购业务.使客户突破排队买票的尴尬和局限,为用户提供更加便利.快捷和优质的旅行服务. 客服电话:028-85246993 官方网站:http://www.sochepiao.com

APIO2017听课笔记关键词

apio2017游记

//第一次写游记,只是流水账...结果好像确实只去游了…… day-11 省选挂了,即将退役……(然而apio之后得知并没有退役,感谢放我一条活路)(吐槽出题人考完才造数据,题目没有子任务之类的玩意,O(Tn^2)暴力ac了T<=100,n<=10000,这符合基本法吗)day-3-day-1 感觉期中考完挂day0 8:30的东航航班,因为"一带一路"会议,要提前三小时到机场,凌晨三点半起床,这时机场大巴都还没有的,幸好领队老师和coder107同乘一辆车,前一天说好捎了