UVA - 1588 Kickdown

20 篇文章 0 订阅

题目大意:给出两个长度不一定相同且每列高度为 1 或 2 的长条,将它们放入一个高度为 3 的容器,求最短容器长度。

解题思路:想到字符串匹配,其中一个长条不动,另一个移动去匹配,高度为 3 则不能同时为 2。这里要考虑的是移动有两个方向,模拟为两种情况:上面的移动下面的不动,即上面的右移;上面的不动下面的动,即上面的左移。取两种中较短的。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[105],b[105];
int main() {
    while(scanf("%s%s", a, b) != EOF) {
        int tot_a = 0,tot_b = 0, i, j;
        int len_a = strlen(a),len_b = strlen(b);
        for (i = 0; i < len_a ; i++) {
            int tag = 1;
            for (j = 0; j < len_b && i+j < len_a; j++)
                if (a[i+j] == '2' && b[j] == '2') {
                    tag = 0; break;
                }
            if (tag) break;
        }
        tot_a = max(len_a, len_b + i);

        for (i = 0; i < len_b; i++) {
            int tag = 1;
            for (j = 0; j < len_a && i+j < len_b; j++)
                if (b[i+j] == '2' && a[j] == '2') {
                    tag = 0; break;
                }
            if (tag) break;
        }
        tot_b = max(len_a + i, len_b);
        printf("%d\n", min(tot_a, tot_b));

        memset (a, 0, sizeof(a));
        memset (b, 0, sizeof(b));
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值