zoukankan      html  css  js  c++  java
  • POJ 2718 Smallest Difference【DFS】

    题意:

    就是说给你一些数,然后要求你使用这些数字组成2个数,然后求他们的差值最小。

    思路:

    我用的双重DFS做的,速度还比较快,其中有一个很重要的剪枝,若当前搜索的第二个数后面全部补零与第一个数所产生的差值比当前所搜索到的结果还要大,那么就直接返回。这个剪枝就是超时与几十MS的差距

    注意一点就是可能有0 与一个数字存在的情况,比如0 3,0 5等等。

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    const int inf=1<<29;
    int num[20],cnt,cnta,cntb,val,ans;
    int nums[10]={1,10,100,1000,10000,100000,1000000};
    bool usea[20],useb[20];
    char ch;
    void DFS_B(int vals,int deep)
    {
        if(deep>0&&abs(val-vals*nums[cntb-deep])>=ans)
    	return;
        if(deep==cntb)
        {
    	ans=min(ans,max(val,vals)-min(val,vals));
    	return;
        }
        for(int i=0;i<cnt;i++)
    	if(!usea[i]&&!useb[i])
    	{
    	    if(deep==0&&num[i]==0)
    		continue;
    	    useb[i]=1;
    	    DFS_B(vals*10+num[i],deep+1);
    	    useb[i]=0;
    	}
    }
    void DFS_A(int vals,int deep)
    {
        if(deep==cnta)
        {
    	val=vals;
    	memset(useb,0,sizeof(useb));
    	DFS_B(0,0);
    	return;
        }
        for(int i=0;i<cnt;i++)
    	if(!usea[i])
    	{
    	    if(deep==0&&num[i]==0)
    		continue;
    	    usea[i]=1;
    	    DFS_A(vals*10+num[i],deep+1);
    	    usea[i]=0;
    	}
    }
    int main()
    {
        int T;
        while(scanf("%d",&T)!=EOF)
        {
    	getchar();
    	while(T--)
    	{
    	    cnt=0;
    	    while((ch=getchar())!='
    ')
    	    {
    		if(ch>='0'&&ch<='9')
    		    num[cnt++]=ch-'0';
    	    }
    	    cnta=cnt>>1;
    	    cntb=cnt-cnta;
    	    ans=inf;
    	    DFS_A(0,0);
    	    if(ans==inf)
    		printf("%d
    ",val);
    	    else
    		printf("%d
    ",ans);
    	}
        }
        return 0;
    }
    
    

    思路二:

    要想两个数的差最小,就是对半分,暴力比较求最小值。

    关键就是用next_permutation()函数求这列数的全排列,排除前导零的情况。

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #define INF 0x3f3f3f3f
    using namespace std;
    
    int a[15];
    int n;
    
    void solve()
    {
        while(a[0]==0)
            next_permutation(a,a+n);
    
        int ans=INF;
        int mid=(n+1)/2;
        do
        {
            if(a[mid])
            {
                int x=a[0],y=a[mid];
                for(int i=1;i<mid;i++)
                    x=x*10+a[i];
                for(int i=mid+1;i<n;i++)
                    y=y*10+a[i];
                if(ans>abs(x-y))
                    ans=abs(x-y);
            }
    
        }while(next_permutation(a,a+n));
        cout<<ans<<endl;
    }
    
    int main()
    {
        int T;
        char c;
    
        scanf("%d",&T);
        getchar();
        while(T--)
        {
            n=0;
            memset(a,0,sizeof(a));
    
            while((c=getchar())!='
    ')
            {
                if(c!=' ')
                    a[n++]=c-'0';
            }
    
            if(n==1)
                printf("%d
    ",a[0]);
            else if(n==2)
                printf("%d
    ",abs(a[1]-a[0]));
            else
                solve();
        }
        return 0;
    }
  • 相关阅读:
    Hibernate整合Druid数据库连接池遇到的问题整合
    Spring 整合quartz 时 定时任务被调用两次以及quartz 的配置
    BigDecimal divide:Non-terminating decimal expansion; no exact representable decimal result.
    Hibernate: Encountered a duplicated sql alias [] during auto-discovery of a native-sql
    oracle与mysql的区别
    搜索评价指标——NDCG
    java 动态修改注解值
    eclipse 取消置顶
    Xiangqi
    All in All
  • 原文地址:https://www.cnblogs.com/demian/p/6183577.html
Copyright © 2011-2022 走看看