题意:给出两个长度分别为n1,n2(n1,n2<=100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳它们的最短容器长度。
案例输入输出如下:
这种题,想通就好做了。
思路:
1.将抽象换成具体数据表示
*长条用Int1数组表示,每一个值就是长条高度
*将两个长条放入一个高度为3的容器---->高度不能超过3---->长条数值相加不能大于3
*一开始起点一致的两个长条,如果不满足条件其中一个就要偏移,直到能插入为止,将其具体为数组坐标的偏移
2.将长条b视为固定不动,将长条a插入,如果不满足就偏移,程序表示为sliver_one[i+j],j是不满足条件时增加,直到所有都满足条件为止(如果两个长条完全不兼容,偏移量就是b长条的长度)
代码如下:
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
int i,j;
int n1, n2;
char char_sliver_one[50] = {'0'};
char char_sliver_two[50] = {'0'};
int sliver_one[50];
int sliver_two[50];
int flag;
while (true)
{
cin >> char_sliver_one >> char_sliver_two;
n1 = strlen(char_sliver_one);
n2 = strlen(char_sliver_two);
j = 0;
flag = 1;
//循环遍历将字符转为数字存进数组
for (i = 0; i < n1;i++)
sliver_one[i] = char_sliver_one[i]-48;
for (i = 0; i < n2; i++)
sliver_two[i] = char_sliver_two[i]-48;
while (j<n1&&flag>0)//如果flag==0,说明遍历之后没有一个不满足条件的
{
flag = 0;//一开始默认是成立的
for (i=0;i<n2;i++)
{
if (sliver_one[i+j] + sliver_two[i] > 3)//遍历找是否有不满足条件的
{
flag = 1;//如果确实不满足条件
j++;
break;
}
}
}
if(n1 < n2+j) cout << "最小长度为:" << j + n2 << endl;
else cout << "最小长度为:" << n1 << endl;
}
}