TCO之旅
TCO之旅
时间限制: 1 Sec 内存限制: 128 MB
提交: 77 解决: 24
[提交][状态][讨论版]
题目描述
我们的小强终于实现了他TCO的梦想了,爬进了TCO的全球总决赛,开始了他的
American之旅,去和TC的titan们去同场竞技去了,这可把小强给乐坏了。。。
由于在American人身地不熟,我们的小强遇到了很大的麻烦,他一下子找不到了比赛的地点,我们可以把交通网络这样进行简化。总共有n个城市,编号从0到n-1,我们的小强现在在标号为0的城市,他要到标号为n-1的城市去的。对于每个城市i,都有一个值cellprice[i]表示到这个城市的代价,如果是-1,就表示无法到达这个城市。在城市i中,存在着到城市i-1和城市i+1的直达车,代价分别为cellprice[i-1]和cellprice[i+1]。在某些城市之间又存在这特殊的城际班车。Entercell[i]表示第i条特殊的城际班车所在的起点城市,exitcell[i]表示第i条特殊的城际班车所在的终点城市。每次乘坐这种特殊的城市班车时所需的代价是price+x,这里的price是个定值,x表示你先前已经乘坐过特殊的城际班车的次数,当你乘坐特殊的城际班车到达某座城市i时,你就不需要花费cellprice[i]。
为了节省花费和时间,我们需要找出一条最优的乘车线路。当然,这个肯定难不倒我们的小强,毕竟是TCO总决赛的选手,这个简直是切菜的活。但现在他就来这里考考你,看你是否有进入TCO world final的能力。他要求首先花费要最少,在花费最少的前提下,要求乘坐的车的次数尽量的少。
输入
每组四行:第一行有个1到50个大于等于-1的整数,即cellprice
第二行有0到50个整数 ,表示特殊的城际班车的出发点, 即entercell
第三行有0到50个整数, 表示上一行所对应的特殊的城际班车的终点, 即exitcell
第四行非负的整数表示 price
我们保证输入的数据是正确的,以上所有的整数均在-1到1000之间,并且出发点的cellprice肯定是非负的。
输出
两个整数 ,分别表示最小的花费和在这种花费下的最小乘车次数,并用一个空格隔开。 如果无法到达终点,则输出-1 -1 ;
样例输入
样例输出
提示
数据是分文件的,第二行和第三行可能是空行
这个也是比较简单的,难就难在如何想到这个思想,最短路的点扩展成为两维,各层之间只有相互的点可以到达,然后相邻两层之间用特殊路径到达,这样建图即可。
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std; typedef pair<int,int>fzy;
const int INF=1e8+,NN=,MM=NN*NN; int n,m,a[NN],st[NN],ed[NN],price;
int cnt,head[NN],rea[MM],next[MM],val[MM],dis[NN][NN],skp[NN][NN];
bool flag[MM],stack[NN][NN];
queue<fzy>p;
string s; void add(int u,int v,int fee)
{
cnt++;
next[cnt]=head[u];
head[u]=cnt;
rea[cnt]=v;
val[cnt]=fee;
}
void init()
{
cnt=;
memset(head,-,sizeof(head));
getline(cin,s);
int i=;
while (i<s.size())
{
int x=,f=;
while ((s[i]<''||s[i]>'')&&i<s.size()) {if (s[i]=='-') f=-;i++;}
while (s[i]>=''&&s[i]<=''&&i<s.size()) x=x*+s[i]-'',i++;
n++,a[n]=x*f;
}
getline(cin,s);
i=;
while (i<s.size())
{
int x=,f=;
while ((s[i]<''||s[i]>'')&&i<s.size()) {if (s[i]=='-') f=-;i++;}
while (s[i]>=''&&s[i]<=''&&i<s.size()) x=x*+s[i]-'',i++;
m++,st[m]=x;
}
for (int i=;i<=m;i++)
st[i]++;
getline(cin,s);
i=m=;
while (i<s.size())
{
int x=;
while (s[i]>=''&&s[i]<='') x=x*+s[i]-'',i++;
while ((s[i]<''||s[i]>'')&&i<s.size()) i++;
m++,ed[m]=x;
}
for (int i=;i<=m;i++) ed[i]++;
scanf("%d",&price);
for (int i=;i<n;i++)
if (a[i+]>=) add(i,i+,a[i+]);
for (int i=n;i>;i--)
if (a[i-]>=) add(i,i-,a[i-]);
for (int i=;i<=m;i++)
if (a[ed[i]]!=-) add(st[i],ed[i],price),flag[cnt]=;
}
void spfa()
{
memset(dis,,sizeof(dis));
dis[][]=,stack[][]=; int hd=,tl=;
p.push(make_pair(,));
while (!p.empty())
{
fzy now=p.front();
p.pop();
int u=now.first,t=now.second;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (flag[i])
{
if (dis[v][t+]>dis[u][t]+val[i]+t&&t<m)
{
dis[v][t+]=dis[u][t]+val[i]+t;
skp[v][t+]=skp[u][t]+;
if (!stack[v][t+])
{
stack[v][t+]=;
p.push(make_pair(v,t+));
}
}
else if (dis[v][t+]==dis[u][t]+val[i]+t) skp[v][t+]=min(skp[v][t+],skp[u][t]+);
}
else if (dis[v][t]>dis[u][t]+val[i])
{
dis[v][t]=dis[u][t]+val[i];
skp[v][t]=skp[u][t]+;
if (!stack[v][t])
{
stack[v][t]=;
p.push(make_pair(v,t));
}
}
else if (dis[v][t]==dis[u][t]+val[i]) skp[v][t]=min(skp[v][t],skp[u][t]+);
}
stack[u][t]=;
}
}
int main()
{
init();
spfa(); int ans1=INF,ans2=INF;
for (int i=;i<=m;i++)
if (dis[n][i]<ans1) ans1=dis[n][i],ans2=skp[n][i];
else if (dis[n][i]==ans1) ans2=min(ans2,skp[n][i]);
if (ans1==INF) printf("-1 -1\n");
else printf("%d %d\n",ans1,ans2-);
}
TCO之旅的更多相关文章
- 一条数据的HBase之旅,简明HBase入门教程-开篇
常见的HBase新手问题: 什么样的数据适合用HBase来存储? 既然HBase也是一个数据库,能否用它将现有系统中昂贵的Oracle替换掉? 存放于HBase中的数据记录,为何不直接存放于HDFS之 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- 【C#代码实战】群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法
若干年前读研的时候,学院有一个教授,专门做群蚁算法的,很厉害,偶尔了解了一点点.感觉也是生物智能的一个体现,和遗传算法.神经网络有异曲同工之妙.只不过当时没有实际需求学习,所以没去研究.最近有一个这样 ...
- Hadoop学习之旅二:HDFS
本文基于Hadoop1.X 概述 分布式文件系统主要用来解决如下几个问题: 读写大文件 加速运算 对于某些体积巨大的文件,比如其大小超过了计算机文件系统所能存放的最大限制或者是其大小甚至超过了计算机整 ...
- .NET跨平台之旅:在生产环境中上线第一个运行于Linux上的ASP.NET Core站点
2016年7月10日,我们在生产环境中上线了第一个运行于Linux上的ASP.NET Core站点,这是一个简单的提供后端服务的ASP.NET Core Web API站点. 项目是在Windows上 ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(2)花式捆绑
本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
随机推荐
- kettle使用正则表达式动态获取excel表
- live事件的替代方法on的使用注意事项
根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...
- node.js 下载安装及gitbook环境安装、搭建
最近需要gitbook看文档,于是各种百度,各种安装,很多都是无法正常安装完成的,比较纠结啊 最后,终于发现一个好用的,现分享一下地址(也是给自己做个记录): 1.node.js下载地址: http: ...
- 三、nginx实现反向代理负载均衡
1.反向代理 需求: 两个tomcat服务通过nginx反向代理 nginx服务器:192.168.101.3 tomcat1服务器:192.168.101.5 tomcat2服务器:192.168. ...
- Java+大数据开发——Hadoop集群环境搭建(二)
1. MAPREDUCE使用 mapreduce是hadoop中的分布式运算编程框架,只要按照其编程规范,只需要编写少量的业务逻辑代码即可实现一个强大的海量数据并发处理程序 2. Demo开发--wo ...
- css浮动Float
核心:浮动元素会脱离文档流并向左/向右移动,直到碰到父元素或者另外一个浮动元素. float :left 向左浮动 right 向右浮动 none (默认) inherit 继承父元素 fl ...
- vSphere笔记01~02
Vmware vsphere 虚拟化 云和大数据的底层!!!! 分类 1.开源:openstack:Linux:难(无图形化) nosqleasystack公司 2.企业版本:vsphere sdn! ...
- 结对作业1--基于GUI的四则运算
201421123002 翁珊,201421123006 黄月梅,201421123007 徐晓珊 题目描述: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程 ...
- 201521123112《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 下面先贴出contains的源代码: public boolean cont ...
- 201521123009 《Java程序设计》第6周学习总结
1. 本周学习总结 2. 书面作业 Q1:clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 用protected修 ...