一、蓝桥公园——JAVA
题目链接:
题目描述
小明喜欢观景,于是今天他来到了蓝桥公园。
已知公园有 N 个景点,景点和景点之间一共有 M条道路。小明有 Q个观景计划,每个计划包含一个起点 st和一个终点 ed,表示他想从 stst 去到 ed。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他吗?
输入描述
输入第一行包含三个正整数 N,M,Q
第 2 到 M + 1 行每行包含三个正整数 u,v,w表示 vu↔v 之间存在一条距离为 w 的路。
第 M+2 到 M + Q-1 行每行包含两个正整数 st,ed,其含义如题所述。
输出描述
输出共 Q 行,对应输入数据中的查询。
若无法从 st 到达 eded 则输出 −1。
输入输出样例
示例 1
输入
3 3 3 1 2 1 1 3 5 2 3 2 1 2 1 3 2 3
输出
1 3 2
运行限制
语言 | 最大运行时间 | 最大运行内存 |
C++ | 1s | 256M |
C | 1s | 256M |
Java | 3s | 256M |
Python3 | 50s | 256M |
JAVA:
importjava.util.Arrays; importjava.util.Scanner; publicclass蓝桥公园 { privatestaticfinallongINF=0x3f3f3f3f3f3f3f3fL; privatestaticfinalintN=405; privatestaticlong[][] dp=newlong[N][N]; privatestaticintn, m, q; publicstaticvoidmain(String[] args) { Scannerscanner=newScanner(System.in); n=scanner.nextInt(); m=scanner.nextInt(); q=scanner.nextInt(); for (long[] row : dp) { Arrays.fill(row, INF); } for (inti=0; i<m; i++) { intu=scanner.nextInt(); intv=scanner.nextInt(); longw=scanner.nextLong(); dp[u][v] =dp[v][u] =Math.min(dp[u][v], w); } floyd(); while (q-->0) { ints=scanner.nextInt(); intt=scanner.nextInt(); if (dp[s][t] ==INF) { System.out.println(-1); } elseif (s==t) { System.out.println(0); } else { System.out.println(dp[s][t]); } } } privatestaticvoidfloyd() { for (intk=1; k<=n; k++) { for (inti=1; i<=n; i++) { for (intj=1; j<=n; j++) { dp[i][j] =Math.min(dp[i][j], dp[i][k] +dp[k][j]); } } } } }
C/C++:
usingnamespacestd; typedeflonglongll; constintN=405; constllINF=0x3f3f3f3f3f3f3f3fLL; lldis[N][N]; intn, m, q; intmain() { cin>>n>>m>>q; memset(dis, 0x3f, sizeofdis); for (inti=1; i<=n; i++) dis[i][i] =0; for (inti=1; i<=m; i++) { llu, v, w; cin>>u>>v>>w; dis[u][v] =dis[v][u] =min(dis[u][v], w); // 防止出现重边 } // floydfor (intk=1; k<=n; k++) for (inti=1; i<=n; i++) for (intj=1; j<=n; j++) dis[i][j] =min(dis[i][j], dis[i][k] +dis[k][j]); // 输出ints, t; for (inti=0; i<q; i++) { cin>>s>>t; llans=dis[s][t] ==INF?-1 : dis[s][t]; cout<<ans<<endl; } return0; }
二、递增序列(蓝桥杯)——JAVA
对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。
例如,如下矩阵中
LANN QIAO
有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN等 13 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。
importjava.util.Scanner; // 1:无需package// 2: 类名必须Main, 不可修改publicclassMain { publicstaticintis1(charch[][],intm,intn){ intans=0; for (inti=0;i<m;i++){ for (intj=0;j<n;j++){ intadd=1; while(j+add<n){ if(ch[i][j]<ch[i][j+add]) ans++; //横add++; } add=1; while(i+add<m){ if(ch[i][j]<ch[i+add][j]) ans++; //列递增add++; } add=1; while (i+add<m&&j+add<n){ if (ch[i][j]<ch[i+add][j+add]) ans++; //右下add++; } add=1; while(i-add>=0&&j+add<n){ if (ch[i][j]<ch[i-add][j+add]) ans++; //右上add++; } add=1; while(i+add<m&&j-add>=0){ if (ch[i][j]<ch[i+add][j-add]) ans++; //左下add++; } } } returnans; } publicstaticvoidmain(String[] args) { Scannerscan=newScanner(System.in); intm=30,n=50; charch[][] =newchar[m][n]; for(inti=0;i<m;i++){ charst[] =scan.nextLine().toCharArray(); ch[i] =st; } System.out.println(is1(ch,m,n)); //在此输入您的代码...scan.close(); //System.out.println("52800"); } }