poj-2718-Smallest Difference

来源:互联网 发布:数据字典下载 编辑:程序博客网 时间:2024/05/20 22:37

题意:0——

思路:因为要找给定序列分成两部分之间的最小差,所以可以肯定两数应该平分这个序列(不知道你们能不能理解这个“平分序列”0.0)。

所以我是以序列总数的一半为上界进行回溯的。


代码附上:

#include <cstdio>#include <cstring>#include <cctype>#include <iostream>#include <queue>#include <cmath>#include <algorithm>#define FIN freopen("input.txt","r",stdin)using namespace std;typedef long long ll;typedef pair<int,int>P;const int MAX = 30;const int INF=0x3f3f3f3f;int n,res,k;int ans[MAX],vis[MAX],digit1[MAX],digit2[MAX];int cast(int *a,int la){  int sum=0;  for(int i=0;i<la;i++)    sum=sum*10+a[i];  return sum;}void calc(int *a,int la,int *b,int lb){  if(la>1&&a[0]!=0){      for(;;){        if(lb>1&&b[0]!=0){          res=min(res,abs(cast(a,la)-cast(b,lb)));        }        if(!next_permutation(b,b+lb)) break;      }    }    else if(la==1)      for(;;){        if((lb>1&&b[0]!=0)||lb==1){          res=min(res,abs(cast(a,la)-cast(b,lb)));        }        if(!next_permutation(b,b+lb)) break;      }}void dfs(int cnt){  if(cnt==k/2){    int l=0;    for(int i=0;i<k;i++)if(!vis[ans[i]]) digit2[l++]=ans[i];    calc(digit1,cnt,digit2,l);    return ;  }  for(int i=0;i<k;i++){    if(!vis[ans[i]]){vis[ans[i]]=1;digit1[cnt]=ans[i];dfs(cnt+1);vis[ans[i]]=0;}  }}int main(){  //FIN;  int T;  scanf("%d",&T);  getchar();  while(T--){    k=0;char ch;    for(;;){      ch=getchar();      if(isdigit(ch)) ans[k++]=ch-'0';      else if(ch=='\n') break;      else continue;    }    res=INF;    memset(vis,0,sizeof(vis));    dfs(0);    printf("%d\n",res );  }  return 0;}


0 0
原创粉丝点击