OR139. 逃脱神凛幻域
描述
受到小人的设计,主人公暮小云落入一个名为神凛幻域的奇特地方。对于迷失在这里的人而言这个空间没有绝对的方向,想要脱离这个地方就必须向前走出n步。由于在这个空间内没有方向的概念,无论何时向任何方向迈出一步都是等效的(哪怕你是原地转圈,只要走出N步即可脱离幻境)。不过,由于空间壁垒的原因,不同时刻向不同方向走所耗费的体力不同。现在已知不同时刻向某个方向跨出一步所需耗费的体力,请你告诉暮小云怎么走最省体力,以及需要耗费的最小体力。
输入描述
有多个输入样例,输入的第一行是样例个数T(1≤T≤50)。每个样例的第一行是一个整数n(1≤n≤100000)。紧接着是四行,依次表示东南西北四个方向的体力耗费情况,每行n个数字,分别表示第n步向该方向走需要花费的体力值xi(0≤xi≤1000000)。某一步的多个方向体力值均为最小值时按照东南西北的顺序取优先方向。输出描述
第一行输出需要的最小体力值,第二行输出行走方案分别用符号ESWN表示东南西北。示例1
输入:
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
C 解法, 执行用时: 2ms, 内存消耗: 232KB, 提交时间: 2019-01-22
#include <stdio.h> #include <string.h> int main(void){ int T,flag; long n; long i,k,min,y; int mincost; char c[4] = {'E','S','W','N'}; char d[100000]; long a[4][100000],b[100000]; scanf("%d",&T); for(y = 0;y < T; y++){ mincost = 0; //memset(d, 0x00, sizeof (char) * 100000); //memset(a,0,sizeof(a)); //memset(b,0,sizeof(b)); scanf("%ld",&n); for(i = 0;i < 4;i++){ for(k = 0;k < n;k++){ scanf("%ld",&a[i][k]); } } for(i = 0;i < n;i++){ min = a[0][i]; flag = 0; for(k = 1;k < 4;k++){ if(min > a[k][i]){ min = a[k][i]; flag = k; } } mincost = mincost + min; d[i] = c[flag]; } printf("%d\n",mincost); for (i = 0;i < n;i++){ printf("%c",d[i]); } printf("\n"); } return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 340KB, 提交时间: 2019-01-28
#include <stdio.h> int t, k; int e[100005], s[100005], w[100005], n[100005]; char dir[100005]; void init() { scanf("%d", &t); } int min_of_four(int a, int b, int c, int d, char* ch) //min value of four direction's power { int min = a; *ch = 'E'; if(b < min) { min = b; *ch = 'S'; } if(c < min) { min = c; *ch = 'W'; } if(d < min) { min = d; *ch = 'N'; } return min; } void fun() { for(int i = 0; i < t; i++) { scanf("%d", &k); for(int j = 0; j < k; j++) scanf("%d", &e[j]); for(int j = 0; j < k; j++) scanf("%d", &s[j]); for(int j = 0; j < k; j++) scanf("%d", &w[j]); for(int j = 0; j < k; j++) scanf("%d", &n[j]); int cnt = 0; for(int i = 0; i < k; i++) cnt += min_of_four(e[i], s[i], w[i], n[i], &dir[i]); printf("%d\n", cnt); for(int i = 0; i < k; i++) printf("%c", dir[i]); printf("\n"); } } int main() { init(); fun(); return 0; }