1588 - Kickdown

题目要求简述:给定长度分别为n1,n2(n1,n2<=100)且每列的高度只为1或者2的长条。需要将他们放入一个高度为3的容器,问能够容纳它们的最短容器长度。

分析:

对于这样的题目显而易见有两种思路,第一,固定一个字符串,另一个从左到右进行移动。第二,固定一个字符串a,字符串b移动,再固定b,让a移动,取二者长度最小值。
两种方法我都经过自己的实现,觉得还是第二种代码更简洁优雅,同时还具有一定的可扩展性。
用例子说明一下吧~

数组1和数组2是我们待比较的两个数组,(当然,都是字符串数组),我们先固定其中的任意一个,放在下方,在让另一个在上方不断向左平移,进行比较,即可

当初次比较时,有如下图例

在这里插入图片描述

在这里插入图片描述

此时,从数组1的头元素开始和数组2的头元素进行比较,当出现两个2,或者匹配部分比较完成时,此次比较完成,用一个状态变量标记此次比较的结果。

由图例知,此次比较会停止在下标为1的元素上。

然后上面的数组下标右移,相当于数组左移,进行第二次比较。

在这里插入图片描述

在这里插入图片描述

由图例知,此次比较是成功的,用两个数组的总长度n1+n2减去匹配部分的长度,即得到此次所需的长度len,如果len小于原先记录的最小长度,则更新最小长度。

不断重复上述过程,直到这种情况为止:

在这里插入图片描述

在这里插入图片描述

这样我们就完成一半的比较任务,接下来,就是将数组1和数组2的位置颠倒,重复上述过程,取两次所得最小值,即可得到最终结果

颠倒并重复上述过程:

#include<cstdio>
#include<cstring>
const int maxn=100;
char a[maxn+1],b[maxn+1];
int n1,n2;
int min(const int &i,const int &j){
    return i<j?i:j;
}
int minLen(char *s1,char *s2,int &n){// n为s1的长度 
    int sumLen=n1+n2,minn=min(n1,n2),len=sumLen;
    for(int i=0;i<n;i++){
        int ok=1,fix=min(n-i,minn);//fix的计算是一个难点 
        for(int j=0;j<fix;j++)if(s1[i+j]=='2'&&s2[j]=='2'){
            ok=0;break;
        }
        if(ok&&len>sumLen-fix)len=sumLen-fix;
    }
    return len;
}
int main(){
    while(scanf("%s%s",&a,&b)==2){
        n1=strlen(a),n2=strlen(b);//无意中用到了逗号运算符 
        printf("%d\n",min(minLen(a,b,n1),minLen(b,a,n2)));//用min函数取两次结果的最小值 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值