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后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
随机推荐
- 在Hudson Job中启动daemon进程
场景 在Hudson中新建一个Job用于构建Web工程,在Job的构建脚本的最后会启动Jetty,观察发现Jetty启动之后一小段时间,进程就终止了. 环境 CentOS 6,Hudson 3.0 ...
- 中科微北斗定位模组ATGM336H简介
36H系列卫星定位模块 产品介绍 ATGM336H是高灵敏度,支持BDS/GPS/GLONASS卫星导航系统的单系统定位,以及任意组合的多系统联合定位的接收机模块.ATGM336H基于本公司自主独立研 ...
- C++ 用lambda代替 unique_ptr 的Deleter
C++ 用lambda代替 unique_ptr 的Deleter 代码 #include <iostream> #include <cstdlib> #include < ...
- spring mvc:日志对象logger的复用
在采用Spring mvc+org.slf4j.Logger开发项目时,发现几乎每个controller或者manager都有的一个标配: private final static Logger LO ...
- Haproxy基于ACL做访问控制
author:JevonWei 版权声明:原创作品 haproxy配置文档 https://cbonte.github.io/haproxy-dconv/ 基于ACL做访问控制(四层代理) 网络拓扑 ...
- PHP初入,简易网页整理(布局&特效的使用)
html><html> <head> <meta charset="UTF-8"> <title></title> ...
- 201521123085 《Java程序设计》第5周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...
- 201521123095 《Java程序设计》第1周学习总结
1. 本周学习总结 开始了对JAVA的初步了解和学习,了解了如何编写简单的JAVA程序. 了解了Java的诞生及发展以及如何运用JVN JRE JDK JVM让JAVA可以 ...
- 201521123039《Java程序设计》第十三周学习总结
1. 本周学习总结 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? 下面是IP地 ...
- 201521123121 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 数据库的基本特点 1.实现数据共享 数据共享包含所有用户可同时存取数据库中的数据,也包括用户可以用各种方式通过接 ...