初试一共两道题目,做答时间2小时
第一题:给定n个公交站,m条线路,假设每条线路坐车的价格均是1元,求从站点1到站点n所花的最少钱。(保证站点1到站点n一定有路径)
每条线路均是1元,求最小花费,本质上就是求公交线路最少换乘数+1。
输入:
第一行:n,m
第二行-第m+1行 线路站点数,线路从第一个站点到最后一个站点
输出:
最少的花费
案例输入:
4 2
3 1 2 3
2 2 4
输出:
2
解题思路
根据所有线路建立一个有向图G。例如某线路经过 1 2 3 共三个站点则增加 1->2, 1->3,2->3三条边,给每一个边的权值是1
则最少花费就是最短路径。使用Dijkstra算法来求。
import java.util.Scanner;
public class Solution{
public static int max = 10000;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int[][] ma = new int[n][n];
int[] tmp = new int[n];
for(int i = 0; i < n; i++){
for(int j = 0; j <n; j++){
ma[i][j] = max;
}
}
for(int i = 0; i < m; i++){
int t = sc.nextInt();
for(int j = 0; j < t; j++){
tmp[j] = sc.nextInt();
}
for(int j = 0; j < t; j++){
for(int k = j+1; k < t; k++){
ma[tmp[j]-1][tmp[k]-1] = 1;
}
}
}
int[] res = dijkstra(ma, 1);
System.out.println(res[n-1]);
}
//求所有站点到第1个站点最短路径
public static int[] dijkstra(int[][] ma, int v){
int n = ma.length;
int[] res = new int[n];
for(int i = 0; i < n; i++){
if(ma[0][i]!=0)
res[i] = ma[0][i];
else
res[i] = max;
}
boolean[] vis = new boolean[n];
vis[0] = true;
for(int i = 0; i < n; i++){
int min = max;
int index = 0;
for(int j = 0; j < n; j++){
if(!vis[i] && res[i] < min){
min = res[i];
index = i;
}
}
vis[index] = true;
for(int j = 0; j < n; j++){
if(min+ma[index][j]<res[j])
res[j] = min+ma[index][j];
}
}
return res;
}
}
第二题:给定几个数,a1, a2, a3...,an, 求 两个数拼接起来能够被7正除的个数。
举个例子 7,21,1,11
721能够被7整除,217也能被7整除
1 - 11 ->111 和 11- 1->算不同的数。
代码见下一篇博客