POJ 2718:Smallest Difference(dfs)

原题地址:点击打开链接

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

描述

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

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

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

比如给0,1,2,4,6,7,那么构成204176差最小,是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了很多次。。

你可能感兴趣的:(算法,C语言,DFS)