算法竞赛入门经典(第二版) 习题3-11 换低档装置(Kickdown) UVa1588 NEERC2006
2015-08-27 00:41
399 查看
Page 59
题意:给出两个长度分别为n1,n2且每列高度只为1或者2的长条,需要将它们放入一个高度为3的容器,问容器的最短长度。
思路:两个字符串起始端对齐,分两个方向移动,得到两个最短长度,再取较小者即可。此题看似简单,技巧却很多,值得思考。
题意:给出两个长度分别为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; }
相关文章推荐
- 65 GCD基本使用
- Oracle索引,B树索引、哈希索引等
- zoj 3885 The Exchange of Items 【最小费用最大流】
- 十四、第三章再续:快速选择SELECT算法的深入分析与实现
- 十三、通过浙大上机复试试题学SPFA 算法
- 十五、多项式乘法与快速傅里叶变换
- shiro android
- Linux磁盘与文件系统管理详细总结
- Filter 编码问题
- 快速排序算法
- 十二之续、快速排序算法的深入分析
- Opengl中矩阵和perspective/ortho的相互转换
- iOS部分-UI基础控件 - 01天 入门 第04课 加法计算器小结
- c 语言用递归法倒序字符串
- 十二之再续:快速排序算法之所有版本的c/c++实现
- iOS部分-UI基础控件 - 01天 入门 第03课 IBAction&IBOutlet
- 数制
- 优化资源配置读后感
- 猜拳游戏 3.0升级版
- 输入3个字符串,按字符串由短到长的顺序输出