POJ2718 Smallest Difference (暴力搜索+全排列)

题目链接:传送门

题意:

给你一个长度为n的数列 ,0<=a[i]<=9;用他们组成两个数

然后使两个数的差最小,求这个数。不能有前导0。

分析:

要使差最小肯定要使两个数的长度尽量相等,一个为n/2,另

一个为n-n/2.然后dfs搜一下选的数,然后另一个数用剩下的

数做一个全排列就可以了。

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

const int mmax = 999999999;

int a[10];
bool vis[10];
int cnt,ans;

void solve(int val){
    int tmp = 0;
    int b[10];
    int tot= 0;
    for(int i=0;i<cnt;i++){
        if(!vis[i]) b[tot++]=a[i],tmp=tmp*10+a[i];
    }
    do{
        tmp = 0;
        for(int i=0;i<tot;i++) tmp=tmp*10+b[i];
        if(b[0]!=0||tot==1) ans = min(ans,abs(tmp-val));
    }while(next_permutation(b,b+tot));
}

void dfs(int val,int num){
    if(num==cnt/2){
        solve(val);
        return;
    }
    for(int i=0;i<cnt;i++){
        if(!vis[i]){
            if(num==0&&a[i]==0&&cnt>3) continue;
            vis[i]=1;
            dfs(val*10+a[i],num+1);
            vis[i]=0;
        }
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    getchar();
    while(t--){
        cnt = 0;
        char s[100];
        gets(s);
        for(int i=0;i<strlen(s);i++)
            if(s[i]>='0'&&s[i]<='9') a[cnt++]=s[i]-'0';
        memset(vis,0,sizeof(vis));
        ans = mmax;
        dfs(0,0);
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-28 14:48:16

POJ2718 Smallest Difference (暴力搜索+全排列)的相关文章

POJ2718 Smallest Difference 【贪心+枚举】

Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4639   Accepted: 1290 Description Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in

【POJ - 2718】Smallest Difference(搜索 )

-->Smallest Difference 直接写中文了 Descriptions: 给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数.剩余元素可以用相同规则构建第二个数.除非构造的数恰好为0,否则不能以0打头. 举例来说,给定数字0,1,2,4,6与7,你可以写出10和2467.当然写法多样:210和764,204和176,等等.最后一对数差的绝对值为28,实际上没有其他对拥有更小的差. Input  输入第一行的数表示随后测试用例的数量.对于每组测试用例,有一行至少两个

(DFS、全排列)POJ-2718 Smallest Difference

题目地址 简要题意: 给若干组数字,每组数据是递增的在0--9之间的数,且每组数的个数不确定.对于每组数,输出由这些数组成的两个数的差的绝对值最小是多少(每个数出现且只出现一次). 思路分析: 对于n个数,必定为分成两个位数分别为n/2和n-n/2的数时才可能取得差的绝对值最小.两组数分别进行全排列比较大小,这样比较次数最大为(10A5)*(5A5)=10!,在可以接受的范围内. 参考代码: 1 #include<stdio.h> 2 #include<cstring> 3 #in

poj 2718 Smallest Difference(暴力枚举)(贪心待补充)

abs写成fabs导致WA了一发. 关于next_permutation()这个STL里面的函数的基本应用 http://www.cnblogs.com/luosuo10/p/5479188.html 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <cmath> 6 using namespace s

Smallest Difference (poj 2718 暴力枚举)

Language: Default Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5034   Accepted: 1382 Description Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits an

POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)

Smallest Difference Description Given a number of distinct decimal digits, you can form one integer by choosing a non-empty subset of these digits and writing them in some order. The remaining digits can be written down in some order to form a second

hdu 1427 速算24点 dfs暴力搜索

速算24点 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description 速算24点相信绝大多数人都玩过.就是随机给你四张牌,包括A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13).要求只用'+','-','*','/'运算符以及括号改变运算顺序,使得最终运算结果为24(每个数必须且仅能用一次).游戏很简单,但遇到无解的

[暴力搜索] POJ 3087 Shuffle&#39;m Up

Shuffle'm Up Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10003   Accepted: 4631 Description A common pastime for poker players at a poker table is to shuffle stacks of chips. Shuffling chips is performed by starting with two stacks o

HDU 3699 A hard Aoshu Problem (暴力搜索)

题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(相同的字符串进行相同的数字替换), 替换后的三个数进行四则运算要满足左边等于右边,求有几种解法. Sample Input 2 A A A BCD BCD B Sample Output 5 72 eg:ABBDE   ABCCC   BDBDE :令 A = 1, B = 2, C = 0, D = 4, E = 5 12245 + 12000 = 24245: 注意没有前导零!! #include<stdio.h>