HDU4522湫湫系列故事——过年回家(2013腾讯编程初赛3)(AC)

2024-05-03 11:58

本文主要是介绍HDU4522湫湫系列故事——过年回家(2013腾讯编程初赛3)(AC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

湫湫系列故事——过年回家

Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1193    Accepted Submission(s): 254


Problem Description
出门在外,最想念的还是家,对在深圳腾讯工作的HR湫湫来说,春节回家是一年中最期盼的事,不仅可以见到阔别已久的亲人,还能以相亲的名义调侃众多帅哥(她的内心告诉她:如果相亲能遇到参加过腾讯编程马拉松的同学,就直接把自己嫁了~)。
  同时,每年的春节湫秋也都会纠结一把,因为车票实在是太难抢了,不过2013的春节有点特殊,作为一个曾经的ACMer,湫湫制作出了很完美的刷票机,也就是说她再也不用担心买不上票了,但是想来想去还是觉得随便买票实在是浪费了辛辛苦苦搞出来的刷票机,所以她决定要用最舒适的方式回家。
  假设湫湫有可能经过的n个城市分别编号从1到n,湫湫要从城市A回到城市B,购票网站上列出了t辆列车行程,每辆车的行程用一个字符串表示,途径的城市间用+号相连,如1+2+3+5代表一辆从1城市分别经过2,3到达5的火车,湫湫可以从中间任意一站出发和下车(路径是单向的,即必须沿字符串从左到右来走),每个字符串对应着一个整数k,k=0表示该车只有硬座,k=1表示该车有卧铺也有硬座,在整个回家的计划中,同一辆车可以坐无限次,为了中途换车的方便,如果在起点坐的是卧铺,则后面乘坐的车必须全是卧铺,同样的,如果在起点坐的是硬座,则后面乘坐的车必须全是硬座,假设一段(一辆车行程中,两相邻城市间为一段)硬座的不舒适度是D1,一段卧铺的不舒适度是D2,求湫湫回家最小的不舒适度。

Input
输入数据的第一行包含一个整数Q,表示测试数据的组数;
  每组数据的第一行是2个正整数n和t,分别表示城市数和列车数;
  接下来t行,每行一个字符串表示列车行程,字符串长度小于10000,每个字符串后跟一个整数k(k为0或1),之间用空格隔开;
  接下来一行是D1,D2,其含义见题目描述;
  最后一行是2个正整数A和B,表示起始和终点城市。

   [Technical Specification]
  1 <= Q <= 100
  1 < n <= 200
  1 < t <= 1000
  0 < D1 <= 10000, 0 < D2 <= 10000,D1和D2的大小关系不确定
  1 <= A, B <= n 且 A <> B

Output
对于每组数据,如果湫湫可以到达目的地,则输出一个整数,表示湫湫到家所需的最小不舒适度。如果不能到达则直接输出-1。

Sample Input
  
1 6 5 2+4+3+5+1+6 1 5+4+2+3+1 1 3+2+5+1+6 1 6+2 0 6+3+1+4+5+2 0 3 2 5 3
Sample Output
     
4
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>//第一次提交WA,确实,为什么给了例子的答案是4
//其实自己做的是对的,只是自己结果打错了,一定要小心,自己是会做的第二次还是WA,有点疑惑了,为什么呢?
//应该还是错在解析城市这一步,之前只试过解析1~9范围内的城市,没有解析过2位数3位数的城市
//最终AC
//我想说这道题拿到手题目意思懂,但是为什么给的例子的答案是4,这个不懂。。。卧铺5->4,4->3
//k=0表示只有硬座,这个要弄好了
//想到是用dijkstra算法来做
#define MAXINT 10005
#define MAXN   205
#define INFINT  100000  //也要注意这个最大值,不能随便出,因为我最后打印是2个或,*的话容易翻转,要不就老老实实的多写几个if
int n     = 0;
int p     = 0;
int D1    = 0;
int D2    = 0;
int start = 0;
int end   = 0;int pathnum = 0;char str[MAXINT];
int path[MAXN][MAXN][2]; //0--表示卧铺,1--表示硬座
int visit[MAXN][2];
int dis[MAXN][2]; //表示从起点到各个点的最短距离,0--表示卧铺,1--表示硬座int strlen()
{int size = 0;int i = 0;while (str[size] != '\0'){size++;}return size;
}void parsess(int k)
{int i    = 0;int j    = 0;int size = 0;int x1 = 0;int x2 = 0;size = strlen();int plus[1000];int num = 0;int kk = 0;for (i = 0; i < size;i++){if ('+' == str[i]){plus[num++] = i;  //保存所有+的位置}}for (i = 0; i < num;i++){kk = 0;x1 = 0;x2 = 0;//解析起点if (0 == i){for (j = 0; j <= plus[i] - 1; j++){x1 = x1*10 + (str[j] - '0') ;//kk++;}}else{for (j = plus[i - 1]+1; j <= plus[i] - 1; j++){x1 = x1 * 10 + (str[j] - '0');//kk++;}}//解析终点kk = 0;if (i == (num-1)){//最后一个点for (j = plus[i]+1; j <= (size - 1); j++){x2 = x2 * 10 + (str[j] - '0');//kk++;}}else{for (j = plus[i] + 1; j <= plus[i + 1] - 1; j++){x2 = x2 * 10 + (str[j] - '0');//kk++;}}if (1 == k) //卧铺硬座都有{			path[x1][x2][0] = 1;path[x1][x2][1] = 1;}else{path[x1][x2][1] = 1;  //k=0表示只有硬座}}return;
}void initstring()
{int i = 0;for (i = 0; i < MAXINT;i++){str[i] = '\0';}return;
}void init()
{int i = 0;int j = 0;int k = 0;for (i = 0; i < MAXINT; i++){str[i] = '\0';}for (i = 0; i < MAXN; i++){for (j = 0; j < MAXN; j++){for (k = 0; k < 2; k++){path[i][j][k]  = INFINT;visit[j][k] = 0;dis[j][k]      = INFINT;}}}pathnum = 0;return;
}void dijsktra()
{int i = 0;int j = 0;int prev = 0;int min = INFINT;dis[start][0] = 0;dis[start][1] = 0;visit[start][0] = 1;visit[start][1] = 1;for (i = 1; i <= n;i++){for (j = 0; j < 2;j++){if (1 == path[start][i][j]){dis[i][j] = 1;}}}//求卧铺for (i = 1; i <= n;i++){min = INFINT;//先找出最短的一个点for (j = 1; j <= n;j++){if ((min>dis[j][0]) && (0 == visit[j][0])){min = dis[j][0];prev = j;}}visit[prev][0] = 1;//更新各个点的距离,根据minfor (j = 1; j <= n; j++){if ((dis[j][0] > (dis[prev][0] + path[prev][j][0])) && (0 == visit[j][0])){dis[j][0] = dis[prev][0] + path[prev][j][0];}}}//求硬座for (i = 1; i <= n; i++){min = INFINT;//先找出最短的一个点for (j = 1; j <= n; j++){if ((min>dis[j][1]) && (0 == visit[j][1])){min = dis[j][1];prev = j;}}visit[prev][1] = 1;//更新各个点的距离,根据minfor (j = 1; j <= n; j++){if ((dis[j][1] > (dis[prev][1] + path[prev][j][1])) && (0 == visit[j][1])){dis[j][1] = dis[prev][1] + path[prev][j][1];}}}return;
}
int main()
{int i = 0;int j = 0;int T = 0;int k = 0;freopen("input.txt","r",stdin);scanf("%d",&T);for (i = 0; i < T;i++){scanf("%d %d",&n,&p);init();for (j = 0; j < p;j++){initstring();scanf("%s",&str[0]);scanf("%d",&k);parsess(k);}scanf("%d %d",&D1,&D2);scanf("%d %d", &start, &end);dijsktra();if ((INFINT != dis[end][0]) || (INFINT != dis[end][1])){printf("%d\n", ((dis[end][0] * D2) > (dis[end][1] * D1)) ? (dis[end][1] * D1) : (dis[end][0] * D2));}else{printf("-1\n");}}return 0;
}

  

这篇关于HDU4522湫湫系列故事——过年回家(2013腾讯编程初赛3)(AC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956698

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl