poj2718Smallest Difference (穷竭搜索)

Posted sunjianzhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2718Smallest Difference (穷竭搜索)相关的知识,希望对你有一定的参考价值。

escription - 题目描述
给定若干位十进制数,你可以通过选择一个非空子集并以某种顺序构建一个数。剩余元素可以用相同规则构建第二个数。除非构造的数恰好为0,否则不能以0打头。

举例来说,给定数字0,1,2,4,6与7,你可以写出10和2467。当然写法多样:210和764,204和176,等等。最后一对数差的绝对值为28,实际上没有其他对拥有更小的差。
Input - 输入
输入第一行的数表示随后测试用例的数量。
对于每组测试用例,有一行至少两个不超过10的十进制数字。(十进制数字为0,1,…,9)每行输入中均无重复的数字。数字为升序给出,相隔恰好一个空格。
Output - 输出
对于每组测试用例,输出一个以上述规则可获得的最小的差的绝对值在一行。
Sample Input - 输入样例
1
0 1 2 4 6 7
Sample Output - 输出样例
28

AC代码:

include

include

include

include

using namespace std;
int shuzi(int num[],int i,int j);
int main()
char str[25];
int num[10],T;
scanf("%d",&T);
getchar();
while(T--)
gets(str);
int i=0,j=0;
for(i=0;str[i]!=‘\0‘;i++)
if(str[i]>=‘0‘&&str[i]<=‘9‘) num[j]=str[i]-‘0‘,j++;

int min1=1000000000;
do
if((num[0]==0&&j/2-1>0)||(num[j/2]==0&&j-1-j/2>0)) continue;
int s1=shuzi(num,0,j/2-1);
int s2=shuzi(num,j/2,j-1);
if(abs(s1-s2)<min1) min1=abs(s1-s2);
while(next_permutation(num,num+j));
cout<<min1<<endl;

return 0;

int shuzi(int num[],int i,int j)
int s=0;
for(int k=0;i<=j;i++,k++)
s=s10+num[i]; //这一个是最重要的,如果使用s=s+num[i]pow(10.0,k)会超时,而这么些不会超时。

return s;

以上是关于poj2718Smallest Difference (穷竭搜索)的主要内容,如果未能解决你的问题,请参考以下文章

poj2718 Smallest Difference

穷竭搜索: POJ 2718 Smallest Difference

POJ 2718 Smallest Difference

POJ - 2718Smallest Difference(搜索 )

Smallest Difference POJ 2718(搜索)

POJ 2718 Smallest Difference 未AC 《挑战程序设计竞赛》