题意翻译
给出两个长度分别为n1,n2(n1,n2<=100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳他们的最短容器长度。
输入输出样例
Sample Input
2112112112
2212112
12121212
21212121
2211221122
21212
Sample Output
10
8
15
思路
解决这个题需要分几个步骤,固定第二个字符串,移动第一个字符串,得到最小长度1.固定一个字符串,移动第二个字符串,得到最小长度2.
然后在两个最小长度中取最小值.
代码
#include <stdio.h>
#include <string.h>
// 用二维数组来记录两个字符串
char str[2][205];
int main() {
while (1) {
// 注意初始化
memset(str, '0', sizeof(str));
for (int i = 0; i < 2; i++) {
// 输入以及终止条件
if (scanf("%s", str[i]) == EOF) {
return 0;
}
getchar();
}
int maxLen;
// 记录两个串的长度
int len[2];
len[0] = strlen(str[0]);
len[1] = strlen(str[1]);
if (len[0] > len[1]) {
maxLen = len[0];
} else {
maxLen = len[1];
}
int s, t;
int i;
// 记录移动长度
int m[2] = {0};
int flag = 0;
for (int k = 0; k < 2; k++) {
if (k == 0) {
s = 0;
t = 1;
} else {
s = 1;
t = 0;
}
for (i = 0; i < 205; i++) {
m[k] = i;
flag = 0;
for (int j = 0; j < len[s]; j++, m[k]++) {
if ((str[t][m[k]] - '0' + str[s][j] - '0') > 3) {
flag = 1;
break;
}
}
if (flag) {
continue;
} else {
break;
}
}
}
if (m[0] > m[1]) {
if (m[1] < maxLen) {
m[1] = maxLen;
}
printf("%d\n", m[1]);
} else {
if (m[0] < maxLen) {
m[0] = maxLen;
}
printf("%d\n", m[0]);
}
}
return 0;
}