您的位置:首页 > 其它

poj之旅——2718

2016-05-08 19:27 295 查看
题目描述及题解:

题意:给出最多10个数字,将它们划分为两个整数,求差异值最小的值(除非只有一位数,否则不允许出现先导0)

题解:很显然如果总共有n个数,必然有一个整数长n/2,另一个长n-n/2,dfs搜一遍即可。

参考程序:

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int INF=0x3f3f3f3f;
int a[12],b[12],N,n,ans;
bool vis[12];
void solve(int aa){
int len=0,bb=0;
for (int i=0;i<n;i++)
if (!vis[i])b[len++]=a[i],bb=bb*10+a[i];
if (b[0]!=0 || len==1) ans=min(ans,abs(aa-bb));
while (next_permutation(b,b+len)){
bb=0;
for (int i=0;i<len;i++)
bb=bb*10+b[i];
if (b[0]!=0 || len==1)
ans=min(ans,abs(aa-bb));
}
}
void dfs(int k,int res){
if (k==n/2){
solve(res);
return;
}
for(int i=0;i<n;i++){
if (!vis[i]){
if (a[i]==0 && k==0 && n>3)
continue;
vis[i]=true;
dfs(k+1,res*10+a[i]);
vis[i]=false;
}
}
}
int main(){
scanf("%d ",&N);
for (int i=0;i<N;i++){
n=0;char ch;
while ((ch = getchar()) != '\n'){
if (ch==' ')continue;
a[n++]=ch-'0';
}
ans=INF;
memset(vis,false,sizeof(vis));
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: