您的位置:首页 > 其它

算法竞赛入门经典(第二版) 习题3-11 换低档装置(Kickdown) UVa1588 NEERC2006

2015-08-27 00:41 399 查看
Page 59

题意:给出两个长度分别为n1,n2且每列高度只为1或者2的长条,需要将它们放入一个高度为3的容器,问容器的最短长度。

思路:两个字符串起始端对齐,分两个方向移动,得到两个最短长度,再取较小者即可。此题看似简单,技巧却很多,值得思考。



#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cctype>
#include<cmath>
#include<algorithm>
using namespace std;
#define M 110
char s1[M],s2[M];
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%s%s",s1,s2)!=EOF){
int len1=strlen(s1),len2=strlen(s2),ans1,ans2,cnt1=0,cnt2=0,i=0,j=0;//cnt1,cnt2表示起始位置

while(i<len1&&j<len2){              //第二个字符串左移
if(s1[i]+s2[j]<'2'+'2') i++,j++;
else cnt1++,i=0,j=cnt1;
}
ans1=len1+len2-i;
//i恰好能表示镶嵌的长度,且len为向某一个方向移动的最短长度,因为移动的过程是容器长度递增的过程
i=j=0;
while(j<len1&&i<len2){              //第一个字符串左移
if(s1[j]+s2[i]<'2'+'2') i++,j++;
else cnt2++,i=0,j=cnt2;
}
ans2=len1+len2-i;
printf("%d\n",ans1<ans2?ans1:ans2);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: