《算法》最小差距

时间限制 1000 ms
内存限制 128 MB
题目描述
  给定一些不同的一位数字,你可以从这些数字中选择若干个,并将它们按一定顺序排列,组成一个整数,把剩下的数字按一定顺序排列,组成另一个整数。组成的整数不能以0开头(除非这个整数只有1位)。
  例如,给定6个数字,0,1,2,4,6,7,你可以用它们组成一对数10和2467,当然,还可以组成其他的很多对数,比如210和764,204和176。这些对数中两个数差的绝对值最小的是204和176,为28。
  给定N个不同的0~9之间的数字,请你求出用这些数字组成的每对数中,差的绝对值最小的一对(或多对)数的绝对值是多少?

输入数据
  第一行包括一个数 T (T≤1000),为测试数据的组数。
  每组数据包括两行,第一行为一个数 N (2≤N≤10),表示数字的个数。下面一行为 N 个不同的一位数字。
输出数据
  T行,每行一个数,表示第 i 个数据的答案。即最小的差的绝对值。
样例输入
2
6
0 1 2 4 6 7
4
1 6 3 4
样例输出
28
5

#include<math.h>
#include<stdio.h>
#include <string.h>
#include<iostream>
#include <algorithm>
using namespace std;
int a[15];
int n;
int abs(int x) { return (x<0 ? -x : x); }
int step1() {
    if (a[1] == 0) swap(a[1], a[2]);
    int s1 = 0, s2 = 0;
    for (int i = 1; i <= n / 2 + 1; i++) s1 = s1 * 10 + a[i];
    for (int i = n; i >= n / 2 + 2; i--) s2 = s2 * 10 + a[i];
    return abs(s1 - s2);
}
int step2() {
    int book[15];
    int s1, s2;
    int ans = (1 << 31) - 1;
    for (int i = 2; i <= n; i++)
        if (a[i - 1]) {
            s1 = a[i], s2 = a[i - 1];
            memset(book, 0, sizeof(book));
            book[i] = book[i - 1] = 1;
            int l = 1, r = n;
            for (int j = 1; j <= (n - 2) / 2; j++) {
                while (book[l]) l++;
                while (book[r]) r--;
                book[l] = book[r] = 1;
                s1 = s1 * 10 + a[l]; s2 = s2 * 10 + a[r];
            }
            ans = min(ans, abs(s1 - s2));
        }
    return ans;
}
int main() {
    int groups;
    cin >> groups;
    while (groups--) {
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        sort(a + 1, a + 1 + n);
        if (n == 2) { 
            cout << a[2] - a[1] << endl;
            continue; 
        }
        if (n % 2 == 1) 
        cout << step1() << endl;
        else 
            cout << step2() << endl;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 8,948评论 0 0
  • 第一次写文章,关注简书很久了,终于鼓起勇气执笔。写的不好,希望大家不要介怀。 本人是一名今年刚刚走入公务员岗位的应...
    拥有甜蜜梦想的小蜗牛阅读 2,688评论 4 0
  • 作为普通人,我们从儿时则担起重任,忙碌中寻找解脱。为了实现父母期望中的抱负,为了始终追随传统的束缚,我们一直在...
    爱的天堂雪阅读 3,077评论 0 0
  • 本以为早就已经远离,却仍还在,谢谢。 今天难得有假期,去家附近的商城逛了逛,吃个晚饭,饭后进了一家很有...
    Kdian阅读 1,768评论 0 0
  • 歪西 我们一定要将自己投入这个时代的洪流里嘛?
    夸我是狗阅读 1,118评论 0 0