poj2718 Smallest Difference

题目http://poj.org/problem?id=2718

给一组十进制数,从中选出若干数字组成一个多位数,剩下的数字组成另一个数字,要求找到最小的选取组合,使得这两个数字的绝对值差最小。

样例输入

1
0 1 2 4 6 7

样例输出

28

思路

  • 因为最多只有10个数字可供选择,所以把所有数字的排列枚举出来,然后从中间分开,组成两个数字,比较各自绝对值差的大小。根据题目带有前导零的数字组合无效。

代码

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 10;
int num[maxn];

int array2num(int *start, int *end){
    int val = 0;
    for(; start < end; start++){
        val = val * 10 + (*start);
    }
    return val;
}


int main(){
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int M; scanf("%d", &M);
    char c; c = getchar();
    while(M--){
        int idx = 0;
        int min_val = 0x3f3f3f3f;
        int val1, val2;
        while((c = getchar()) != '\n'){
            if(c != ' ') num[idx++] = c-'0';
        }
        if(idx == 1) { printf("%d", num[0]); return 0;}  //idx是数字个数
        do{
            int mid = idx / 2;
            if(idx - mid > 1 && num[mid] == 0) continue; //去掉含有前导零的情况
            else if(mid > 1 && num[0] == 0) continue;
            else{
                val1 = array2num(num, num+mid); 
                val2 = array2num(num+mid, num+idx);
            }
            min_val = min(abs(val1-val2), min_val);
        }while(next_permutation(num, num+idx));
        printf("%d\n", min_val);
    }
}

posted @ 2020-01-17 12:15  patrolli  阅读(109)  评论(0编辑  收藏  举报