| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1171 人关注过本帖, 1 人收藏
标题:一道ACM算法简单题
只看楼主 加入收藏
chuangketie1
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-10-18
收藏
得分:0 
回复 10楼 czz5242199
ok,谢大神。默默地去读代码了。
2013-10-18 21:41
zhaogay
Rank: 7Rank: 7Rank: 7
来 自:宫
等 级:黑侠
帖 子:151
专家分:586
注 册:2013-10-10
收藏
得分:0 
写了个,不知道行不行:
程序代码:
#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 编辑 ]

好好学习,天天想上
2013-10-18 23:12
快速回复:一道ACM算法简单题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011838 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved