uva 1587 Kickdown

来源:互联网 发布:反补世界树 知乎 编辑:程序博客网 时间:2024/05/16 11:31

描述:有两个长度为n1和n2的长条,每点的高度可能为2或者1,求一个最小的高度为3的容器的长度去能装下这两个长条。
分析:我分三种情况,让短的动,长的不动,1.。长的完全包含了短的。2.短的在长的左边部分重合。3.短的在长的右边部分重合。
应该先从尽可能重叠部分多的情况找起,找到就return。没优化。

#include <algorithm>#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;char a[105],b[105];int ans;int f(char* a,char* b,int la,int lb){    int len=la+lb;    for(int i=0;i<=la-lb;i++){        int ok=1;        for(int j=0;j<lb;j++)if(a[i+j]+b[j]>'1'+'2')ok=0;        if(ok)return la;    }    for(int i=1;i<lb;i++){        int ok=1;        for(int j=0;j<i;j++)if(a[j]+b[lb-i+j]>'1'+'2')ok=0;        if(ok)len=min(len,la+lb-i);    }    for(int i=1;i<lb;i++){        int ok=1;        for(int j=0;j<i;j++)if(b[j]+a[la-i+j]>'1'+'2')ok=0;        if(ok)len=min(len,la+lb-i);    }    return len;}int main(){    while(cin>>a>>b){        int lena=strlen(a),lenb=strlen(b);        if(lena>=lenb)ans=f(a,b,lena,lenb);        else ans=f(b,a,lenb,lena);        cout<<ans<<endl;    }    return 0;}
1 0