回复 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 编辑 ]









