• 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()) != '
    '){
                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
    ", min_val);
        }
    }
    
    
  • 相关阅读:
    JavaScript中Null和Undefined的区别
    javascript中的计算题
    数组去重
    javascript面向对象中继承实现的几种方式
    数列求值 题解
    首字母变大写 题解
    发工资咯:) 题解
    绝对值排序 题解
    数列有序 题解
    母牛的故事 题解
  • 原文地址:https://www.cnblogs.com/patrolli/p/12205174.html
Copyright © 2020-2023  润新知