原题

POJ 2718

参考

大佬的代码

题意

给定一个N个数字(N不小于2且不大于10),这些数字取值范围为0到9且互不相同,且升序排列,将这些数字组成两组数,使得这两组数的绝对差最小。注:这两组数字均不能以0开头。

AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std; 
int s[18],n,mid,idx,ans; 
int num(int a,int b)
{
	int n=0;
	for(int i=a;i<=b;i++)
	{
		n*=10;
		n+=s[i];
	}
	return n;
}
void solve()
{
	ans=INF;
	mid=idx/2;
	if(idx==2)
		ans=abs(s[0]-s[1]);
	do
	{
		if(s[0]==0||s[mid]==0)	continue;
		int x=num(0,mid-1);
		int y=num(mid,idx-1);
		ans=min(ans,abs(x-y));
	}while(next_permutation(s,s+idx));
	printf("%d\n",ans);
}
int main()
{
	scanf("%d",&n);
	getchar();
	while(n--)
	{
		idx=0;
		char c;
		while((c=getchar())!='\n')
			if(c!=' ')
				 s[idx++]=c-'0'; 
		solve();
	}
	return 0;
}

总结

①题中给出升序无需sort
②注意那句continue剪枝
③注意输入方法
④idx实际已经记录了s[]的长度 无需要用strlen计算出数组长度

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐