回复 10楼 czz5242199
ok,谢大神。默默地去读代码了。
程序代码:
#include <stdio.h> #include <stdlib.h> struct array { int slot; int value; }; int sort(struct array*, int); int min(struct array*, int); int main() { int line, i, j, first; struct array *sNum; int *reslt; scanf("%d", &line); reslt = (int*)malloc(line*sizeof(int)); for(i = 0; i < line; i++) { scanf("%d", &first); sNum = (struct array*)malloc(first*sizeof(struct array)); for (j = 0; j < first; j++) { scanf("%d", &sNum[j].value); sNum[j].slot = j + 1; } sort(sNum, first); reslt[i] = min(sNum, first); } for (i = 0; i < line; i++) { printf("%d\n", reslt[i]); } free(sNum); free(reslt); return 0; } /* 对每行数据排序 */ int sort(struct array *sNum, int num) { int i, j, tmp; for(i = 0; i < num; i++) { for(j = 0; j < num - i -1; j++) { if (sNum[j].value < sNum[j+1].value) { tmp = sNum[j].value; sNum[j].value = sNum[j+1].value; sNum[j+1].value = tmp; tmp = sNum[j].slot; sNum[j].slot = sNum[j+1].slot; sNum[j + 1].slot = tmp; } } } return 0; } /* 求f(i)的值,并求和 */ int min(struct array *tree, int num) { int value[num]; int i, j, min1, min2, sum = 0; for (i = 0; i < num ; i++) { min1 = 999999, min2 = 999999; /* 向前搜最近的值 */ for (j = i - 1; j < i && j >= 0; j--) { if (tree[i].slot > tree[j].slot) { min1 = tree[j].value - tree[i].value; break; } } /* 向后搜最近的值 */ for (j = i + 1; j < num; j++) { if (tree[i].slot > tree[j].slot) { min2 = tree[i].value - tree[j].value; break; } } if (min1 == 999999 && min2 == 999999) min1 =0; value[i] = min1 < min2 ? min1 : min2; } for (i = 0; i < num; i++) { sum += value[i]; } return sum; }
[ 本帖最后由 zhaogay 于 2013-10-18 23:37 编辑 ]