算法竞赛入门经典
习题3-11 换低挡装置(Kickdown, ACM/ICPC NEERC 2006, UVa1588)
给出两个长度分别为n1,n2(n1,n2≤100)且每列高度只为1或2的长条。需要将它们放 入一个高度为3的容器(如图3-8所示),问能够容纳它们的最短容器长度。
分析:先固定一个长的,让短的那根长条从最开始往后移,遇到吻合的话就输出,结束循环。
C语言代码:
#include <stdio.h>
#include <string.h>
void Search(int m,int n,char strip1[],char strip2[])
{
int ans=0,temp=0,ok=1;
for(int k1=0;k1<=m;k1++)
{
int ok1=1,k=k1,ok2=1;
for(int k2=0;k2<n&&k<m;k2++,k++)
if((strip1[k]+strip2[k2])>('3'+48))
{
ok1=0;break;
}
if(ok1)
{
if(n+k1<=m)
{
ans=m;break;
}
else
{
ans=n+k1;break;
}
}
}
for(int i=n-1;i>=0;i--)
{
ok=1,temp=i;
for(int j=n-1;j>=n-1-i;j--,temp--)
if((strip1[temp]+strip2[j])>=100)
{
ok=0;break;
}
if(ok)
{
ans=(ans>(m+n-i-1)?(m+n-i-1):ans);
break;
}
}
printf("%d\n",ans);
}
int main(void)
{
char strip1[105],strip2[105];
memset(strip1,'A',sizeof(strip1));
memset(strip2,'A',sizeof(strip2));
while(scanf("%s %s",strip1,strip2)==2)
{
int m=strlen(strip1),n=strlen(strip2);
if(m<n)
Search(n,m,strip2,strip1);
else
Search(m,n,strip1,strip2);
memset(strip1,'A',sizeof(strip1));
memset(strip2,'A',sizeof(strip2));
}
return 0;
}
思考:数组赋初值另一种方法:
memest(数组名,类型,sizeof(数组名));