POJ - 2718

POJ - 2718

DFS 子集枚举 全排列枚举 next_permutation

给你一串不重复的数字,要你分成两部分,让这两部分的值的差尽可能的小。

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main() {
    int t,k,a[10],num1,num2,ans;
    char c;
    scanf("%d",&t);
    getchar();
    while(t --) {
        k = 0;
        ans = 1 << 30;
        while(scanf("%c",&c)) {// 这种读入方式真香
            if(c == ' ') continue;
            if(c == '\n') break;
            a[k ++] = c - '0';
        }
        if(k == 2) {// 特判两个数字的情况就行了。
            printf("%d\n",abs(a[0] - a[1]));
            continue;
        }
        while(next_permutation(a,a + k)) {
            if(a[0] == 0 || a[k / 2] == 0) continue;
            num1 = num2 = 0;
            for(int i = 0;i < k/2; ++i) num1 = num1 * 10 + a[i];
            for(int i = k/2;i < k; ++i) num2 = num2 * 10 + a[i];
            ans = min(ans,abs(num1 - num2));
        }
        printf("%d\n",ans);
    }
    return 0;
}

参考

https://blog.csdn.net/qq_37555704/article/details/78613681

posted @ 2020-03-09 17:30  南风--  阅读(66)  评论(0编辑  收藏  举报