习题3-11 Kickdown UVA - 1588

不知道是我把题意理解错了还是题目出错了,我觉得,在题目的要求之下,如果能够反转其中一块板,那么会得到更短的长度。但是测试数据表明不需要反转板。

刚开始写怎么写都写不对,因为对相交部分的考虑不够细致,处理的比较粗糙,后来看了网上大佬的代码,才明白应该怎么做才简单。只需要比较三个数据:字符串1的长度、字符串2的长度、当前模拟的移动字符串的长度减去当前字符串已遍历过的字符的数量。取它们中的最小值,作为循环的边界,这样就不会出界了。

下面是代码。实现思路是,固定a字符串,移动b字符串;然后固定b字符串,移动a字符串。具体题解详见某大佬blog:https://www.cnblogs.com/luruiyuan/p/5562520.html

#include <bits/stdc++.h>
using namespace std;
int minlen(string a,string b);
int main()  {
    string a,b;
    while (cin>>a&&!a.empty())  {
        cin>>b;
        cout<<min(minlen(a,b),minlen(b,a))<<endl;
    }
    return 0;
}

int minlen(string a,string b)  {
    int alen=(int)a.size(),blen=(int)b.size();
    int res=alen+blen,smallen=min(alen,blen);
    for (int i=0;i<alen;i++)  {
        int j,rg=min(smallen,alen-i);
        for (j=0;j<rg;j++)
            if (a[i+j]=='2'&&b[j]=='2')   break;
        if (j==rg)  res=min(res,alen+blen-rg);
    }
    return res;
}
posted @ 2018-09-19 21:24  CF过2100就买ARCTERYX  阅读(162)  评论(0编辑  收藏  举报