题目大意是,给两个每列高度只为 1 或 2 的长条,将他们放入高度为 3 的容器中,问容器的最短长度。实际上就是将两个数组上下放置,固定一个移动另一个,使得对应位置上不同时为 ‘2’ 即可。需要注意的是有两种移动方法,固定 a 左移 b 和固定 b 左移 a ,这两种移动会有不同的效果,取其中较小的便可。 jdg() 函数中用来判断被移动数组循环次数的步骤略显繁琐。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int jdg(char *m, char *n, int len1, int len2)
{
int t, flag, cnt;
for(int i=0; i < len1; i++){
flag = 1;
cnt = 0;
t = i;
if(i + len2 > len1){
for(int j = 0; j < len1 - t; j++){
if(m[i] == '2' && n[j] == '2'){
flag = 0;
break;
}
cnt++;
i++;
}
}else{
for(int j = 0; j < len2; j++){
if(m[i] == '2' && n[j] == '2'){
flag = 0;
break;
}
cnt++;
i++;
}
}
if(flag) break;
i = t;
}
return len1 + len2 - cnt;
}
int main()
{
char a[105], b[105];
while(scanf("%s%s", a, b) == 2){
int len_a = strlen(a);
int len_b = strlen(b);
printf("%d\n", min(jdg(a, b, len_a, len_b), jdg(b, a, len_b, len_a)));
}
return 0;
}