POJ 2718 Smallest Difference 利用next_permutation搜索 解题错误总结及AC代码C/C++
原题POJ 2718参考大佬的代码题意给定一个N个数字(N不小于2且不大于10),这些数字取值范围为0到9且互不相同,且升序排列,将这些数字组成两组数,使得这两组数的绝对差最小。注:这两组数字均不能以0开头。AC代码#include<iostream>#include<cstdio>#include<algorithm>#define INF...
·
原题
参考
题意
给定一个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计算出数组长度
更多推荐
已为社区贡献3条内容
所有评论(0)