题目描述
受到小人的设计,主人公暮小云落入一个名为神凛幻域的奇特地方。对于迷失在这里的人而言这个空间没有绝对的方向,想要脱离这个地方就必须向前走出n步。由于在这个空间内没有方向的概念,无论何时向任何方向迈出一步都是等效的(哪怕你是原地转圈,只要走出N步即可脱离幻境)。不过,由于空间壁垒的原因,不同时刻向不同方向走所耗费的体力不同。现在已知不同时刻向某个方向跨出一步所需耗费的体力,请你告诉暮小云怎么走最省体力,以及需要耗费的最小体力。
输入描述:
有多个输入样例,输入的第一行是样例个数T(1≤T≤50)。每个样例的第一行是一个整数n(1≤n≤100000)。紧接着是四行,依次表示东南西北四个方向的体力耗费情况,每行n个数字,分别表示第n步向该方向走需要花费的体力值xi(0≤xi≤1000000)。某一步的多个方向体力值均为最小值时按照东南西北的顺序取优先方向。
输出描述:
第一行输出需要的最小体力值,第二行输出行走方案分别用符号ESWN表示东南西北。
思路:
之道题只需要判断每一次向前走一步时在四个方向中体力消耗最小的一个方向就可以了。
喜欢的老铁们留个赞再走呗
放代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin = new Scanner(System.in);
int t = cin.nextInt();// 测试用例的数量
String s[][] = new String[t][2];//定义一个二维数组
for (int i = 0; i < t; i++) {
int sum = 0;//离开需要的最小体力
String str = "";
String ss = "";//用最少的体力离开需要的方向顺序
int n = cin.nextInt();//需要迈出的步数
int a[][] = new int[4][n];
for (int j = 0; j < 4; j++) {
for (int k = 0; k < n; k++) {
a[j][k] = cin.nextInt();
}
}
for (int j = 0; j < n; j++) {
if (j == 0) {
int min = Math.min(Math.min(a[0][j], a[1][j]), Math.min(a[2][j], a[3][j]));//找到需要的体力最少的值
sum += min;
if (min == a[0][j])
ss = "E";//把用到的体力最少的方向值赋予给SS
else if (min == a[1][j])
ss = "S";
else if (min == a[2][j])
ss = "W";
else
ss = "N";
} else {
int min = Math.min(Math.min(a[0][j], a[1][j]), Math.min(a[2][j], a[3][j]));
sum += min;
//更新方向
if (min == a[0][j])
ss = ss + "E" + str;
else if (min == a[1][j])
ss = ss + "S" + str;
else if (min == a[2][j])
ss = ss + "W" + str;
else
ss = ss + "N" + str;
}
}
s[i][0] = String.valueOf(sum);
s[i][1] = ss;
}
for(int i = 0;i<t;i++) {
//输出对应的体力和方向
System.out.println(s[i][0]);
System.out.println(s[i][1]);
}
}
}