uva1588 Kickdow

题意:题意:给出两个长度分别为n1,n2且每列高度只为1,或者2的长条,需要将它们放入一个高度最高为3的容器,问容器的最短长度。 

点击打开链接

思路:我先定一个,一个移动,第一次求出len1,第二次求出len2,然后选择最小值。博主第一次天真以为只要定长的就行

2222 211这这个例子就是bug。

#include<bits/stdc++.h>

using namespace std;

string s1,s2;
int main(){
    //freopen("data.in","r",stdin);
    while(cin>>s1>>s2){
            //cout<<s1<<endl<<s2<<endl;
        if(s1.size()<s2.size()){
            swap(s1,s2);
        }
        int pos,ok=0;
        for(int i=0;i<s1.size();i++){
                pos=i;ok=0;
            for(int j=0,l=i;j<s2.size();){
                    //cout<<s1[l]+s2[j]<<endl;
                if(s1[l]+s2[j]<=99){
                    l++;j++;
                    //cout<<l<<endl;
                    if(j>=s2.size()||l>=s1.size())
                    {
                        ok=1;
                        break;
                    }
                }else{
                    break;
                }
            }
            if(ok==1)
                break;
        }
        if(pos==s1.size()-1&&s2[0]+s1[pos]>99)
            pos++;
        //cout<<pos<<endl;
        int len1=max(pos+s2.size(),s1.size());

         for(int i=0;i<s2.size();i++){
                pos=i;ok=0;
            for(int j=0,l=i;j<s1.size();){
                    //cout<<s1[l]+s2[j]<<endl;
                if(s2[l]+s1[j]<=99){
                    l++;j++;
                    //cout<<l<<endl;
                    if(j>=s1.size()||l>=s2.size())
                    {
                        ok=1;
                        break;
                    }
                }else{
                    break;
                }
            }
            if(ok==1)
                break;
        }
        //cout<<pos<<endl;
        if(pos==s2.size()-1&&s2[pos]+s1[0]>99)
            pos++;
        int len2=pos+s1.size();
        int ans=min(len1,len2);
        cout<<ans<<endl;

    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wxl7777/article/details/80420662