做一道水题欢乐一下。

总时间限制:

1000ms
内存限制:
65536kB
描述

从2014年12月28日起,北京市公交地铁将执行新的票价方案。其中地铁的票价方案改为:6公里(含)内3元;6公里至12公里(含)4元;12公里至22公里(含)5元;22公里至32公里(含)6元;32公里以上部分,每增加1元可乘坐20公里。

地铁交通网络有许多线路组成,每条线路又由多个地铁站连接而成(为简化问题,部分线路和部分地铁站被从地图上略去)。比如地铁4号线和1号线的部分地铁站名称和相邻站之间的距离如下表:

4号线 起始/终到车站

区间距离(米)

圆明园——北京大学东门

1295

北京大学东门——中关村

887

中关村——海淀黄庄

900

海淀黄庄——人民大学

1063

人民大学——国家图书馆

2709

国家图书馆——西直门

1958

西直门——西四

3225

西四——西单

1880

西单——宣武门

815

……

1号线 起始/终到车站

区间距离(米)

军事博物馆——木樨地

1166

木樨地——复兴门

1715

复兴门——西单

1590

西单——天安门西

1217

天安门西——天安门东

925

天安门东——王府井

852

……

如果我们从北京大学东门出发,前往天安门东,需要先乘坐地铁4号线到达西单站,然后在西单换乘地铁1号线,最后到达天安门东。整个行程的路程为:

(887+900+1063+2709+1958+3225+1880)+ (1217+925) = 14764(米)

因此,按照新的票价方案,乘坐地铁从北京大学东门到达天安门东需要花费5元。

现在我们化简地铁网络,假设网络中至多只有2条线路,并且网络要么是“一”字形,要么是“十”字形,不存在环路(从一个站出发经过若干不同的站后又回到出发站)。

现在任意给出两个地铁站,从其中一个出发到达另外一个地铁站的票价是多少?

输入
第一行是一个整数cases(1<=cases<=10),表示测试数据的个数。下面是cases组测试数据。

对于每组测试数据,第一行是两个整数L(1<=L<=2)和D(1<=D<=10),分别表示地铁线路的个数和问题的个数。

然后是L行,每行表示一个地铁线路。每行首先是一个数字M(2<=M<=20),表示这条线路上地铁站的个数。然后是用空格隔开的M个字符串和(M-1)个整数,字符串是M个地铁站的拼音,它们按线路上的顺序依次排列;数字位于两个字符串之间,表示这两个相邻地铁站之间的距离。

然后是D行,每行两个字符串,分别为起点和终点地铁站,要求输出它们之间的票价。输入数据保证线路中存在起点和终点,并且有唯一的路线可达。

输出
对于每组测试数据,首先输出一行”Casei:”,然后是D行,每行代表从起点到达终点地铁站的票价。

注意,不同组测试数据之间的地铁线路不能互用,例如,你不能用第1组测试数据的地铁线路去求解第2组测试数据中的票价。

样例输入
21 25 YuanMingYuan 1295 BeiJingDaXueDongMen 887 ZhongGuanCun 900 HaiDianHuangZhuang 1063 RenMinDaXueBeiJingDaXueDongMen ZhongGuanCunBeiJingDaXueDongMen RenMinDaXue2 110 YuanMingYuan 1295 BeiJingDaXueDongMen 887 ZhongGuanCun 900 HaiDianHuangZhuang 1063 RenMinDaXue 2709 GuaJiaTuShuGuan 1958 XiZhiMen 3225 XiSi 1880 XiDan 815 XuanWuMen7 JunShiBoWuGuan 1166 MuXiDi 1715 FuXingMen 1590 XiDan 1217 TianAnMenXi 925 TianAnMenDong 852 WangFuJingBeiJingDaXueDongMen TianAnMenDong
样例输出
Case 1:33Case 2:5

这题比较简单,就没有使用图的算法,直接在两条线路上进行查找。

这里使用vector容器来存储地铁站的信息,每个vector的元素是一个pair容器,存放站名和该站到下一站的距离。

用map存储每个站的站名信息,这样便于查找每个站点在哪条线路上。

count_price:根据距离来计算票价,这里只要注意一下double到int转换就可以了。

count_distance:根据地铁线路的vector,和两个地铁站的名称来计算两个地铁站之间的距离。

#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;int count_price(int distance){  // 计算价格double km = distance / 1000;int price = 0;if (km <= 6)return 3;else if (km > 6 && km <= 12)return 4;else if (km > 12 && km <= 22)return 5;else if (km >22 && km <= 32)return 6;else {price = ((km - 32) / 20 + 6 + 1);return price;}
}int count_distance(vector<pair<string,int> > lines_info, string station_a, string station_b){bool flag = false;int total_distance = 0;for (vector<pair<string, int> >::iterator it = lines_info.begin(); it != lines_info.end(); ++it){if (!flag && ((*it).first == station_a || (*it).first == station_b )){flag = true;total_distance += (*it).second;continue;}if (flag) {total_distance += (*it).second;}if (flag && ((*it).first == station_a || (*it).first == station_b)){total_distance -= (*it).second;break;}}return total_distance;
}int main(){int cases, L, D, stations_count;string name, station_a, station_b, common_station;int distance, total_distance;bool flag = false;char buffer[50];cin >> cases;for (int m = 0; m < cases; ++m){cout << "Case " << m + 1 << ":" <<endl;cin >> L >> D;vector<pair<string, int> >* lines_info = new vector<pair<string, int> >[L];  // L是地铁的线路map<string, int>* station_names = new map<string, int>[L];  // 用于判断// 读入地铁线路的信息bool isFind = false;for (int i = 0; i < L; ++i){cin >> stations_count;while (stations_count --){  // 读入地铁站和地铁站到下一站的长度if (stations_count != 0)cin >> name >> distance;else{cin >> name;distance = 0;}lines_info[i].push_back(pair<string, int>(name, distance));station_names[i].insert(pair<string, int>(name, distance));if (i == 1){  // 查找共同站点if ( !isFind && station_names[0].find(name) != station_names[0].end()){common_station = name;isFind = true;}}}}// 计算路程while (D--){cin >> station_a >> station_b;total_distance = 0;if (L == 1)cout << count_price(count_distance(lines_info[0], station_a, station_b)) << endl;else if (L == 2){// 计算的两个站点都位于第一条线路if ((station_names[0].find(station_a) != station_names[0].end())&& (station_names[0].find(station_b) != station_names[0].end())){cout << count_price(count_distance(lines_info[0], station_a, station_b)) << endl;}// 计算的两个站点都位于第二条线路else if ((station_names[1].find(station_a) != station_names[1].end())&& (station_names[1].find(station_b) != station_names[1].end())){cout << count_price(count_distance(lines_info[1], station_a, station_b)) << endl;}// 两个站点位于不同的线路else{if (station_names[0].find(station_a) != station_names[0].end())cout << count_price(count_distance(lines_info[0], common_station, station_a)+ count_distance(lines_info[1], common_station, station_b)) << endl;elsecout << count_price(count_distance(lines_info[1], common_station, station_a)+ count_distance(lines_info[0], common_station, station_b)) << endl;}}}delete [] lines_info;}return 0;
}

POJ 4113:北京地铁票价-BeiJing Subway相关推荐

  1. 北京地铁票价查询系统 c++ Dijkstra算法

    包含一号线.二号线全部,还有两小段 数据来自北京地铁官网 资源链接 https://download.csdn.net/download/renzemingcsdn/44352688 #include ...

  2. 编程帮助小明计算地铁票价(C++)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 题目: 北京地铁票价发生了变化,现在新的计算规则如下:6公里内3元(包括6公里). 6-12公里4元(不包括6公里,包括12公里). ...

  3. 王清:从北京地铁降价看公共产品属性回归

    王清:从北京地铁降价看公共产品属性回归 作者:王清 10月7日起,北京市轨道交通全路网(不含机场轨道交通线)实行单一票制,票价为2元/人次,即乘客乘坐轨道交通一次出行,不论乘坐距离长短和换乘次数多少, ...

  4. 题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元

    题目 - 北京地铁 描述 北京地铁涨价了,现在的地铁票价计算方法如下: 6公里内 3元 (包括6公里) 6-12 公里 4元 (不包括6公里,包括12公里) 12-32 公里 每10公里加1元(不包括 ...

  5. 基于svg绘制北京地铁图(官网数据来源)

    北京地铁图 北京地铁图,基于svg开发,支持PC.移动端多种浏览器. 线上开源地址 https://github.com/StavinLi/beiJingSubway 点个赞吧! 项目介绍 技术点 1 ...

  6. Project 2 : 北京地铁数据处理及路径探寻

    完成北京地铁路线搜寻 使用搜寻策略完成如下项目:接收两个北京地铁站站点,得到两个站点间的优化路径. Please using the search policy to implement an age ...

  7. 涨姿势!北京地铁原来是16条旅游专线

    学姐按:周末想带孩子玩,又没太多时间.好不容易有时间出去了,结果半天都被堵在了路上,这让很多家长每逢周末必发愁.为什么不换种方式出行呢?北京的地铁的里程越来越长,殊不知所经之处有很多的大小景点可以玩. ...

  8. WPF简易北京地铁效果图

    这个是百度地图上北京地铁的地址http://map.baidu.com/?subwayShareId=beijing,131,我们先看下百度上面的效果图 我要实现的内容比较简单,就是绘制这些图,和在地 ...

  9. 北京地铁月度消费总金额计算(Python版)

    最近业余时间在学习Python,这是那天坐地铁时突发奇想,想看看我这一个月的地铁费共多少钱,所以简单的构思了下思路,就直接开写了,没想到用Python来实现还挺简单的. 设计思路: 每次乘车正常消费7 ...

最新文章

  1. grub2引导linux内核,一种基于grub2的linux系统启动bootloader的制作方法与流程
  2. C#三层ATM-11.查看交易信息
  3. mysql schedule event,MySQL 定时器event
  4. 【课题总结】OpenCV 抠图项目实战(3)抠图综述
  5. kaggle账号_kaggle是什么?对找工作的帮助!如何入门kaggle?
  6. php mvc登陆注册,Asp.Net MVC 5使用Identity之简单的注册和登陆
  7. CentOS 7.0系统安装配置LAMP服务器(Apache+PHP+MariaDB)
  8. 2021-07-22MATLAB基于元胞自动机模型的传染病扩散模型
  9. CH340以及CH系列USB转串口驱动下载
  10. maven配置阿里仓库
  11. Android 开发横屏App或创建横屏布局
  12. 手把手DES加密解密详解-Java,Python
  13. MATLAB主题设置配色方案
  14. 今日骑行路线里程。。。
  15. 大数据之Redis:Redis之一主二仆模式
  16. dotnet 从入门到放弃的 500 篇文章合集
  17. 合作共赢!荷兰Swissflow成功入驻ISweek工采网!
  18. git lfs原理和使用
  19. 计算机在英语口语教学中的应用,计算机在英语口语与听力教学中的应用.doc
  20. 《史蒂夫·乔布斯传》读后感

热门文章

  1. Python图片下载器(单线程PK多线程)_一蓑烟雨任平生
  2. 嵌入式系统求职回忆录
  3. python列表list元素降序排列两种方法
  4. Android短视频开发
  5. 为什么是List list=new ArrayList();?
  6. nba全明星java_2018nba全明星阵容
  7. 网络基础——牛客网刷题第四波
  8. java 后台打开新页面_Java后台打开浏览器窗口
  9. oracle显示人民币,如何在ORACLE中实现人民币大写的转换
  10. 用Python告诉你广州房租现状