题意:给出两个长度为n1,n2(n1,n2<=100)且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,求能够容纳它们的最短容器长度。
思路:先将n1固定不动,n2从第一位与n1比较是否两个相加大于四,是的话就将n2向右移动一位,再从头比较,直到没有任何一列相加大于四就记录下这种情况的最短长度;
然后将n2固定不动,执行一样的操作,求出另一个最段长度,最后取最小的。一次AC真开森
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
char s1[110],s2[110];
int n1[210],n2[210];
int main()
{
int i,j;
while (~scanf("%s%s",s1,s2))
{
memset(n1,0,sizeof(n1));
memset(n2,0,sizeof(n2));
int len1=strlen(s1);
int len2=strlen(s2);
for (i=0;i<len1;i++) n1[i]=s1[i]-'0';
for (i=0;i<len2;i++) n2[i]=s2[i]-'0';
int minlen=max(len1,len2);
for (i=0;i<len1;i++)
{
for (j=0;j<len2;j++)
{
if (n1[i+j]+n2[j]>=4)
break;
}
if (j==len2)
break;
}
int le1=len2+i;
for (i=0;i<len2;i++)
{
for (j=0;j<len1;j++)
{
if (n2[i+j]+n1[j]>=4)
break;
}
if (j==len1)
break;
}
int le2=i+len1;
minlen=max(minlen,min(le1,le2));
printf("%d\n",minlen);
}
return 0;
}