POJ 2718 暴力

来源:互联网 发布:剑灵捏脸数据图下载 编辑:程序博客网 时间:2024/05/21 07:06

题意

  • 给你一个0-9的串,挑其中一部分的数字排列成一个数,其它数字排列成一个数(两个数都不能有前导0)
  • 问你这两个数差的绝对值最小是多少

思路

  • n很小,2-10,数字不会重复出现,直接暴力枚举即可
  • 注意,不能复杂度过高,稍微有些技巧的就是两个数的位数应该尽可能接近,即都是n/2最好
  • 所以枚举全排列,计算下在n/2的位置前后两个数差是几即可
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <string>using namespace std;const int maxn = 12;const int inf = 0x3f3f3f3f;int a[maxn];int n;int ans = inf;int cal(int inx){    int num1 = 0, num2 = 0;    for (int i=0;i<inx;i++){        num1 *= 10;        num1 += a[i];    }    for (int i=inx; i < n; i++){        num2 *= 10;        num2 += a[i];    }    return abs(num1 - num2);}void dfs(int dep){    if (dep == n){        if (n > 3 && a[0] == 0){            return;        }        int index = n / 2;        if (n >= 3 && a[index] == 0){            return;        }        ans = min(cal(index), ans);        return;    }    for (int i=dep;i<n;i++){        swap(a[i], a[dep]);        dfs(dep + 1);        swap(a[dep], a[i]);    }}int main(){    int T;    char str[30];    cin>>T;    cin.getline(str, 1);    while(T--){        ans = inf;        string s;        cin.getline(str, 30);        s = str;        n = s.length() / 2 + 1;        for (int i=0;i<s.length();i+=2){            a[i/2] = int(s[i] - '0');         }        dfs(0);        cout << ans << endl;    }    return 0;}
原创粉丝点击