• POJ 2133


    类似于DP一样做,但这题有个大坑,自己看DIS吧。。。。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string.h>
    #define LL __int64
    using namespace std;
    
    const int N=1<<16;
    const int inf=1<<30;
    int dp[N];
    char str[25];
    int ans[25];
    int num[125],b,n,goal;
    
    int judge(int f,int s){
    	int tmp;int c=0;
    	for(int k=0;k<b;k++){
    		tmp=1<<k;
    		if((f&tmp)==(s&tmp))
    		c++;
    	}
    	return c;
    }
    
    int main(){
    	while(scanf("%d%d",&b,&n)!=EOF){
    		scanf("%s",str+1);
    		goal=0;
    		int len=strlen(str+1);
    		for(int i=len;i>=1;i--){
    			int t=str[i]-'0';
    			goal+=t*(1<<(b-i));
    		}
    		int tmp=(1<<b)-1;;
    		for(int k=1;k<=n;k++){
    			scanf("%s",str+1);
    			len=strlen(str+1);
    			num[k]=0;
    			for(int i=len;i>=1;i--){
    				int t=str[i]-'0';
    				num[k]+=t*(1<<(b-i));
    			}
    		}
    		bool flag=false;
    		for(int k=1;k<=n;k++){
    			if(num[k]==goal){
    				len=0;
    				if(goal==0){
    					printf("1
    ");
    					int pos=goal;
    					while(b--){
    						ans[++len]=pos%2;
    						pos>>=1;
    					}
    					for(int i=len;i>0;i--)
    					printf("%d",ans[i]);
    					printf("
    ");
    					flag=true;
    					break;
    				}
    				else if(goal!=0){
    					printf("2
    ");
    					int pos=goal;
    					while(b--){
    						ans[++len]=pos%2;
    						pos>>=1;
    					}
    					for(int i=len;i>0;i--)
    					printf("%d",ans[i]);
    					printf("
    ");
    					flag=true;
    					break;
    				}
    			}
    		}
    		if(flag) continue;
    		for(int k=0;k<=tmp;k++){
    			dp[k]=inf;
    		}
    		for(int i=1;i<=n;i++)
    		dp[num[i]]=0;
    		for(int i=1;i<=n;i++){
    			for(int k=0;k<=tmp;k++){
    				dp[k]=min(dp[k],dp[k^num[i]]+1);
    			}
    		}
    		int pos=-1,c=-1,t;
    		for(int k=0;k<=tmp;k++){
    			if(dp[k]!=inf){
    				t=judge(k,goal);
    				if(t>c){
    					pos=k;
    					c=t;
    				}
    				else if(t==c){
    					if(dp[pos]>dp[k])
    					pos=k;
    				}
    			}
    		}
    		printf("%d
    ",dp[pos]);
    		len=0;
    		while(b--){
    			ans[++len]=pos%2;
    			pos>>=1;
    		}
    		for(int i=len;i>0;i--)
    		printf("%d",ans[i]);
    		printf("
    ");
    	}
    	return 0;
    }
    	
    

      

  • 相关阅读:
    vue动态组件
    服务端渲染和nuxt简单介绍
    nuxt Window 或 Document未定义解决方案
    知乎专栏开放性api
    小程序的一些坑
    搭建微服务器(续)
    调研pwa和sw
    mysql索引原理以及优化
    装饰器
    斐波那契数列和小青蛙跳跳跳问题
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4294797.html
Copyright © 2020-2023  润新知