第三章:UVa1588 解题报告

来源:互联网 发布:dijkstra算法原理 编辑:程序博客网 时间:2024/06/03 20:54

UVa1588 解题报告

这道题可以直接模拟。因为齿轮是条状,高度只有两种,所以只要匹配字符串就可以了。两个字符串的相交区域计算高度相加是不是大于3,小于3便是合法的配对。处理A、B两个字符串时枚举B在总长中的起点和B的自身下标后进行匹配即可。以A的0下标为原点,B的0下标设为起点,这样B的起点从负数-B.length()开始,一直到A.length()+B.length(),然后B在A上左右滑动,寻找最小合法解。
预处理将A设置为最长的字符串,注意边界处理,即是A、B等长时。
以下是代码(可直接AC):

#include <iostream>#include <string>#include <cmath>using std::cin;using std::cout;using std::string;int main(){    string a,b;    int min=999999;    int in=0;    while(cin>>a>>b)    {        int len1=a.length(),len2=b.length();        min=999999;        in=0;        if(len1<len2)        {            string tmp;            tmp=a;            a=b;            b=tmp;            len1=a.length();            len2=b.length();        }        for(int i=-len2;i<len1+len2-1;i++)//枚举起点        {            int ok=1;//是否合法的标记            for(int j=0;j<len2;j++)                if(j+i>=0&&i+j<len1)//重叠区域才进行判断合法性                    if(a[i+j]-'0'+b[j]-'0'>3)                        ok=0;            if(ok&&i<0)//B在A左方                min=std::min(-i+len1,min);            if(ok&&i>len1-len2)//B在A右方                min=std::min(len2+i,min);            if(ok&&i>=0&&i+len2<=len1)//B与A完全重叠,合法就直接输出,不会有更小解            {                in=1;                break;            }        }        if(in)            cout<<len1<<'\n';        else            cout<<min<<'\n';    }    return 0;}
0 0
原创粉丝点击