受到小人的设计,主人公暮小云落入一个名为神凛幻域的奇特地方。对于迷失在这里的人而言这个空间没有绝对的方向,想要脱离这个地方就必须向前走出n步。由于在这个空间内没有方向的概念,无论何时向任何方向迈出一步都是等效的(哪怕你是原地转圈,只要走出N步即可脱离幻境)。不过,由于空间壁垒的原因,不同时刻向不同方向走所耗费的体力不同。现在已知不同时刻向某个方向跨出一步所需耗费的体力,请你告诉暮小云怎么走最省体力,以及需要耗费的最小体力。
受到小人的设计,主人公暮小云落入一个名为神凛幻域的奇特地方。对于迷失在这里的人而言这个空间没有绝对的方向,想要脱离这个地方就必须向前走出n步。由于在这个空间内没有方向的概念,无论何时向任何方向迈出一步都是等效的(哪怕你是原地转圈,只要走出N步即可脱离幻境)。不过,由于空间壁垒的原因,不同时刻向不同方向走所耗费的体力不同。现在已知不同时刻向某个方向跨出一步所需耗费的体力,请你告诉暮小云怎么走最省体力,以及需要耗费的最小体力。
有多个输入样例,输入的第一行是样例个数T(1≤T≤50)。每个样例的第一行是一个整数n(1≤n≤100000)。紧接着是四行,依次表示东南西北四个方向的体力耗费情况,每行n个数字,分别表示第n步向该方向走需要花费的体力值xi(0≤xi≤1000000)。某一步的多个方向体力值均为最小值时按照东南西北的顺序取优先方向。
第一行输出需要的最小体力值,第二行输出行走方案分别用符号ESWN表示东南西北。
1 15 54 66 60 24 100 24 2 67 74 80 55 61 1 51 78 6 52 18 100 95 10 14 15 55 1 8 70 33 2 63 44 24 28 43 52 8 18 58 16 93 67 80 16 33 20 79 2 47 53 88 88 25 59 89 45 89 45 3 72 52
220 SNSEWWESWSSNESW
for _ in range(int(input())):
length, directions = int(input()), [] # 将四个方向数组放到directions里保存
for _ in range(4):
directions.append(list(map(int, input().split())))
min_method, min_value = "", 0
for i in range(length):
current_choice = [directions[0][i], directions[1][i], directions[2][i], directions[3][i]]
min_value += min(current_choice)
min_method += "ESWN"[current_choice.index(min(current_choice))]
print(min_value)
print(min_method)
import java.util.*; public class Main { private static final int MAX = 1000000 + 10; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); while (T-- != 0) { int n = sc.nextInt(); final char[] directions = {'E', 'S', 'W', 'N'}; int[][] in = new int[4][n]; for (int i = 0; i!=4; i++) { for (int j=0; j!=n; j++) { in[i][j] = sc.nextInt(); } } int ans = 0; StringBuilder sb = new StringBuilder(); for (int i=0; i!=n; i++) { int minIndex = 0; for (int j=1; j!=4; j++) { if (in[minIndex][i] > in[j][i]) { minIndex = j; } } ans += in[minIndex][i]; sb.append(directions[minIndex]); } System.out.println(ans); System.out.println(sb.toString()); } return; } }
#include<iostream> using namespace std; int a[1000000]; int b[1000000]; int c[1000000]; int d[1000000]; int main() { int n,T,sum; cin>>T; while(T--) { sum=0; cin>>n; string st=""; for(int i=0;i<n;cin>>a[i++]); for(int i=0;i<n;cin>>b[i++]); for(int i=0;i<n;cin>>c[i++]); for(int i=0;i<n;cin>>d[i++]); for(int i=0;i<n;i++) { if(a[i]<=b[i]&&a[i]<=c[i]&&a[i]<=d[i]){ st+='E'; sum+=a[i]; }else if(b[i]<=c[i]&&b[i]<=d[i]){ st+='S'; sum+=b[i]; }else if(c[i]<=d[i]){ st+='W'; sum+=c[i]; }else{ st+='N'; sum+=d[i]; } } cout<<sum<<endl<<st<<endl; } }
#include <bits/stdc++.h> using namespace std; int main() { int num; scanf("%d",&num); int n; string str; for(int i=0;i<num;i++) { scanf("%d",&n); int array[4][n]; int count = 0; str = ""; for(int j=0;j<4;j++) { for(int k=0;k<n;k++) { scanf("%d",&array[j][k]); } } for(int j=0;j<n;j++) { int min = 1000001; int direct = 0; for(int k=0;k<4;k++) { if(min>array[k][j]) { min = array[k][j]; direct = k; } } if(direct==0) { str += 'E'; } if(direct==1) { str += 'S'; } if(direct==2) { str += 'W'; } if(direct==3) { str += 'N'; } count += min; } printf("%d\n",count); cout<<str<<endl; } }
#include <bits/stdc++.h> using namespace std; int main(){ int T; cin>>T; while(T--){ int n; cin>>n; string dir="ESWN",ans; ans.resize(n); vector<int> arr(n,INT_MAX); //滚动数组(保存最小值) for(int i=0;i<4;i++){ for(int j=0;j<n;j++){ int t; cin>>t; if(t<arr[j]){ arr[j]=t; //最小步数 ans[j]=dir[i]; //记录方向 } } } int sum=0; for(int i:arr){ sum+=i; } cout<<sum<<endl<<ans<<endl; } }
m=int(input()) l1=['E','S','W','N'] for i in range(m): s=0 res='' n=int(input()) ve=list(map(int,input().split())) vs=list(map(int,input().split())) vw=list(map(int,input().split())) vn=list(map(int,input().split())) for j in range(n): l=[ve[j],vs[j],vw[j],vn[j]] k=l.index(min(l)) s=s+l[k] res=res+l1[k] print(s) print(res)
#include <iostream> #include <string> using namespace std; int main() { int T = 0, i = 0, n = 0, j = 0, k = 0; cin >> T; for (i = 0; i < T; i++) //T个案例 { string ans = ""; //用来记录每一次选择的方向,方便最后输出 long sum_HP = 0; //用来表示最后得到的最小的体力值 cin >> n; //需要进行n步,后面进行动态的数组申请 long *E = new long[n + 1]; long *S = new long[n + 1]; long *W = new long[n + 1]; long *N = new long[n + 1]; long **A = new long*[4]; //通过A进行一个归拢,方便后面写代码,可以短一些 A[0] = E; A[1] = S; A[2] = W; A[3] = N; for (j = 0; j < 4; j++) //输入每个方向每一步的体力值 { for (k = 0; k < n; k++) { cin >> A[j][k]; } } for (j = 0; j < n; j++) //进行每一步的最小值的搜索 { int min_index = 0; long min_HP = 10000000; for (k = 0; k < 4; k++) //在线搜索,进行替代 { if (min_HP > A[k][j]) //注意大于号,保证相同时,是按照东南西北的顺序 { min_index = k; min_HP = A[k][j]; } } sum_HP += min_HP; switch (min_index) //对最小位置进行一个匹配,对字符串进行拼接 { case 0: ans = ans + "E"; break; case 1: ans = ans + "S"; break; case 2: ans = ans + "W"; break; case 3: ans = ans + "N"; break; } } cout << sum_HP << endl; cout << ans << endl; //输出之后,进行动态删除 delete []E; delete []S; delete []W; delete []N; delete []A; } return 0; }
#include<iostream> #include<algorithm> using namespace std; int mi(int a,int b,int c,int d,char &y) { int e=min(min(min(a,b),c),d); if(a==e) { y='E'; } else if(b==e) { y='S'; } else if(c==e) { y='W'; } else { y='N'; } return e; } int main() { int t; cin>>t; while(t--) { int n; cin>>n; int a1[100001],a2[100001],a3[100001],a4[100001]; for(int i=0;i<n;i++) { cin>>a1[i]; } for(int i=0;i<n;i++) { cin>>a2[i]; } for(int i=0;i<n;i++) { cin>>a3[i]; } for(int i=0;i<n;i++) { cin>>a4[i]; } char a[100001]; long long int sum=0; for(int i=0;i<n;i++) { sum+=mi(a1[i],a2[i],a3[i],a4[i],a[i]); } cout<<sum<<endl; for(int i=0;i<n;i++) { cout<<a[i]; } cout<<endl; } return 0; }
#include<iostream> using namespace std; int main() { char d[4]={'E','S','W','N'}; int T; cin >> T; for(int t = 0; t < T; t++) { int n; cin >> n; int* xi = new int[n](); string stategy(n,'E'); int temp; for(int i = 0; i < n; i++) { cin >> temp; xi[i] = temp; } for (int dir = 0; dir < 3; dir++) { for(int i = 0; i < n; i++) { cin >> temp; if(temp < xi[i]) // better { xi[i] = temp; //更新 stategy[i] = d[1+dir]; } } } int r = 0; for(int i = 0; i < n; i++) { r += xi[i]; } cout << r << endl << stategy << endl; delete []xi; } return 0; }
class Solution(object): def calc(self, a): res = a[0] idx=0 for i in range(len(a)): if res>a[i]: res=a[i] idx=i return res, idx def label(self, t): if t == 0: return 'E' if t == 1: return 'S' if t == 2: return 'W' if t == 3: return 'N' while True: try: a = Solution() n_sample = input() while n_sample: n_step = input() m_E = (raw_input()).split(' ') m_S = raw_input().split(' ') m_W = raw_input().split(' ') m_N = raw_input().split(' ') lst_e=map(int,m_E) lst_s = map(int, m_S) lst_w = map(int, m_W) lst_n = map(int, m_N) lst=[lst_e,lst_s,lst_w,lst_n] res=0 path=[] temp=[0,0,0,0] for i in range(n_step): temp[0]=lst[0][i] temp[1] = lst[1][i] temp[2] = lst[2][i] temp[3] = lst[3][i] res_v,res_i=a.calc(temp) res=res+res_v path.append(a.label(res_i)) print(res) print(''.join(path)) n_sample=n_sample-1 except: break
T = int(input()) for x in range(T): n = int(input()) matrix = [] for i in range(4): matrix.append(list(map(int, input().rstrip().split()))) sum = 0 way = [] switch = { 0:'E', 1:'S', 2:'W', 3:'N', } for i1 in range(n): min = matrix[0][i1] loc = 0 for i2 in range(4): if matrix[i2][i1] < min: min = matrix[i2][i1] loc = i2 sum += min way.append(switch[loc]) print(sum) print( ''.join(way) )
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * @author wylu */ public class Main { static final String DIRECTION = "ESWN"; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(br.readLine()); while ((t--) != 0) { int n = Integer.parseInt(br.readLine()); int[][] x = new int[4][n]; for (int i = 0; i < 4; i++) { String[] strs = br.readLine().split(" "); for (int j = 0; j < n; j++) { x[i][j] = Integer.parseInt(strs[j]); } } StringBuilder sb = new StringBuilder(); int res = 0; for (int i = 0; i < n; i++) { int tmp = 0; for (int j = 1; j < 4; j++) { if (x[j][i] < x[tmp][i]) tmp = j; } res += x[tmp][i]; sb.append(DIRECTION.charAt(tmp)); } System.out.println(res); System.out.println(sb); } } }