您的位置:首页 > Web前端

POJ 2718:Smallest Difference(dfs)

2016-05-07 11:23 288 查看

原题地址:点击打开链接

(原题是英文,下面的是用有道翻译的)

描述

鉴于许多不同的小数位数,你可以通过选择一个非空的子集形成一个整数的位数和写一些秩序。剩下的数字可以写在一些秩序形成第二个整数。除非得到的整数是0,整数可能不会从数字0开始。

例如,如果您有数字0,1,2,4,6和7,您可以编写两个整数10和2467。当然,有很多方法可以形成这样的双整数:210年和764年,204年和176年,等。整数之间的差异的绝对值在过去的28岁,事实证明,没有其他一对由上面的规则可以实现一个更小的差异。

(题意就是说给几个数字(从0到9且不会重复),用这几个数字组成两个数,使他们差的绝对值最小

比如给0,1,2,4,6,7,那么构成204和176差最小,是28,而构成276,140就不是最小的了)

输入

输入的第一行包含病例数。对于每个案例中,都有一行输入包含至少两个但不超过10个小数位数。(小数位数0,1,……9)。没有数字不止一次出现在一行的输入。数字将出现在增加订单,由一个空格隔开。

输出

对于每个测试用例,写在一行两个整数的最小绝对差,可以从给定的数字写如上所描述的规则。

时间限制: 1000 ms

内存限制: 65536 k

Sample Input

1

0 1 2 4 6 7

Sample Out
28

#include <iostream>
#include <algorithm>
#include <cctype>
#include <cstdio>
#define MAX_N 10

using namespace std;

int a[MAX_N], n, ans;

int ArrayNum(int l, int r)
{
int num = 0;
for(int i = l; i < r; i ++)
num = num*10 + a[i];
return num;
}

void solve()
{
ans = 1E10;
do{
int m = n / 2;
if(!a[0] && m > 1)
continue;
if(!a[m] && n - m > 1)
continue;

ans = min(ans, abs(ArrayNum(0, m) - ArrayNum(m, n)));
}while(next_permutation(a, a + n));
cout << ans << endl;
}

int main()
{
int M;
cin >> M;
getchar();	//忽略'\n'

while(M --){
char ch;
n = 0;
while((ch = getchar()) != EOF){
if('\n' == ch)
break;
else if(isdigit(ch))
a[n ++] = ch - '0';
}
solve();
}
return 0;
}


Dfs暴力加筛选,因为最多只有10! = 362 8800次,足够用了

这道题之前还以为输入的第一行是数字个数的,结果就WA了很多次。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: