这道题目也算遍历的题目,着实容易混淆,而且数组开的大小,以及最开始的清零都值得好好反思自己WA的原因~
给出两个长度分别为n1,n2(n1,n2<=100)且每列高度只能为1或者2的长条。需要将他们放入一个高度为3的容器(如下面图所示),问能够容纳他们的最短容器长度。
样例输入
2112112112
2212112
12121212
21212121
2211221122
21212
2222222222
21111
样例输出
10
8
15
11
思路:这个题目最容易想到就是遍历一遍,将一个长条不动,另一个长条就一点一点向后放,直到所有的长度都吻合(高度≤3),但是要注意这里是那个长条向后移动,所以要讨论,取两种情况的最小值~
PS:这里面数组开大为了初始化为零,防止长度不够之后不能判断~
代码如下:ヾ(◍°∇°◍)ノ゙
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<algorithm> #include<math.h> using namespace std; int n1[210],n2[210];//开大的原因上面说了 string s1,s2; int mx(int a,int b)//判断大小值 { if(a>b) return a; return b; } int main() { int l1,l2,ans1,ans2,ans,i,j; while(cin>>s1) { cin>>s2; memset(n1,0,sizeof(n1)); memset(n2,0,sizeof(n2)); l1=s1.length(); l2=s2.length(); for(int i=0;i<l1;i++) n1[i]=s1[i]-'0'; for(int i=0;i<l2;i++) n2[i]=s2[i]-'0'; //开始// for(i=0;i<l2;i++)//这里注意是移动上面的,因为下面的起点在增加 { for(j=0;j<l1;j++) { if(n2[i+j]+n1[j]>3)//未满足则中间跳出 break; } if(j==l1)//这里很巧妙,若成功匹配则未跳出 break; } ans1=max(l1+i,l2); //这里要注意可以反过来着过来放~即移动下面的字符串 for(i=0;i<l1;i++) { for(j=0;j<l2;j++) { if(n1[i+j]+n2[j]>3) break; } if(j==l2) break; } ans2=max(i+l2,l1); ans=min(ans1,ans2);//两次取最小值即可 printf("%d\n",ans); } return 0; }