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

相关文章

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

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

zoj 3228 ac自动机

给出一个字符串和若干个单词,问这些单词在字符串里面出现了多少次。单词前面为0表示这个单词可重叠出现,1为不可重叠出现。 Sample Input ab 2 0 ab 1 ab abababac 2 0 aba 1 aba abcdefghijklmnopqrstuvwxyz 3 0 abc 1 def 1 jmn Sample Output Case 1 1 1 Case 2

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0