第三章 数组与字符串 UVa1588 Kickdown

题目要求简述:给定长度分别为n1,n2(n1,n2<=100)且每列的高度只为1或者2的长条。需要将他们放入一个高度为3的容器,问能够容纳它们的最短容器长度。

分析:

  1. 对于这样的题目显而易见有两种思路,第一,固定一个字符串,另一个从左到右进行移动。第二,固定一个字符串a,另一个字符串b移动,再固定b,取长度最小值。
  2. 两种方法我都经过自己的实现,觉得还是第二种代码更简洁优雅,同时还具有一定的可扩展性。

用例子说明一下吧~

数组1和数组2是我们待比较的两个数组,(当然,都是字符串数组),我们先固定其中的任意一个,放在下方,在让另一个在上方不断向左平移,进行比较,即可

当初次比较时,有如下图例

  此时,从数组1的头元素开始和数组2的头元素进行比较,当出现两个2,或者匹配部分比较完成时,此次比较完成,用一个状态变量标记此次比较的结果。

由图例知,此次比较会停止在下标为1的元素上。

  然后上面的数组下标右移,相当于数组左移,进行第二次比较。

由图例知,此次比较是成功的,用两个数组的总长度n1+n2减去匹配部分的长度,即得到此次所需的长度len,如果len小于原先记录的最小长度,则更新最小长度。

不断重复上述过程,直到这种情况为止:

这样我们就完成一半的比较任务,接下来,就是将数组1和数组2的位置颠倒,重复上述过程,取两次所得最小值,即可得到最终结果

颠倒并重复上述过程:

明白了思路,接下来让我们给出一个简洁的代码实现:

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=100;
 4 char a[maxn+1],b[maxn+1];
 5 int n1,n2;
 6 int min(const int &i,const int &j){
 7     return i<j?i:j;
 8 }
 9 int minLen(char *s1,char *s2,int &n){// n为s1的长度
10     int sumLen=n1+n2,minn=min(n1,n2),len=sumLen;
11     for(int i=0;i<n;i++){
12         int ok=1,fix=min(n-i,minn);//fix的计算是一个难点
13         for(int j=0;j<fix;j++)if(s1[i+j]==‘2‘&&s2[j]==‘2‘){
14             ok=0;break;
15         }
16         if(ok&&len>sumLen-fix)len=sumLen-fix;
17     }
18     return len;
19 }
20 int main(){
21     while(scanf("%s%s",&a,&b)==2){
22         n1=strlen(a),n2=strlen(b);//无意中用到了逗号运算符
23         printf("%d\n",min(minLen(a,b,n1),minLen(b,a,n2)));//用min函数取两次结果的最小值
24     }
25 }

好啦,今天就到这里,贴一下战果以及传送门,大家加油哦~~~,拜拜\(•ω•`)o

题目传送门:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4463

时间: 2024-10-08 13:02:49

第三章 数组与字符串 UVa1588 Kickdown的相关文章

紫书第三章 数组和字符串

1  序 系统的整理下第三章的学习笔记.例题代码是在未看书本方法前自己尝试并AC的代码,不一定比书上的标程好:习题除了3-8百度了求解方法,其它均独立完成后,会适当查阅网上资料进行整理总结.希望本博文方便自己日后复习的同时,也能给他人带来点有益的帮助(建议配合紫书--<算法竞赛入门经典(第2版)>阅读本博客).有不足或错误之处,欢迎读者指出. 2  例题 2.1  UVa272--Tex Quotes #include <stdio.h> int main() { bool log

第四章 数组,字符串和指针

数组 数组若没有指定初始值则为内存遗留值 如果指定了部分初始值,那么其余部分也默认被指定为0: long data[100]={0};          //给data数组的所有元素赋0 字符串是附加有特殊字符(/0)的字符序列 数组的填充: char president[]="thank you"; wchar_t president[]=L"thank you";     //Unicode字符串 const int max=80; char name[max]

程序设计基础 第七章 数组与字符串

第七章 数组与字符串 A总结: 1.数组是同类型的集合,同一个数组的数组元素具有相同的数据类型,引用数组就是引用数组的各元素,通过下标的变化可以引用任意一个数组元素,注意不要进行下标越界的引用,那样会带来副作用. 2.数组类型在数据处理和数值计算中有十分重要的作用,数组与循环的结合可以解决很多的问题. 3.数组可以根据下标的多少分类:一维数组(一个下标)……… 4.C语言使用字符数组来存放字符串,该字符数组中包含一个’\0’字符,代表字符串的结尾. B解析: 7.1:数组的基本概念 :按一定的顺

C++教程第三章-数组

转载请注明出处: http://blog.csdn.net/miaoyunzexiaobao PS:命名空间的概念:之前写的std::cout/std::cin/std::endl等,表示cout/cin/endl这些属于一个名为std的命名空间,不愿写的话可以在main之前声明:using namespace std,表明本函数使用命名空间std.命名空间的概念会在以后讲解. 1.      数组的概念 数组是一组类型的值的集合,是由类型名,标识符和维数组成的复合数据类型.其中类型名规定了数组

从思维导图中学习javascript第三章数组

1对数组的操作方法: 1. push():在数组末尾添加数组 2.unshift():在数组头部添加元素 3.concat()合并两个数组 4pop()删除返回数组的最后一个元素 5shift()删除并返回数组的第一个元素 splice(参数1,参数2,参数3): 删除任意数量的项:1要删除的起始下标2要删除的项数 在制定位置插入指定的项:1.起始下标2.0(不删除任何项)3.要插入的项 替换任意数量的项:1.起始下标2.要删除的项数3.要插入的项 slice(参数1,参数2):从已有数组中选取

快学Scala-第三章 数组相关操作

知识点: 1.定长数组 Array val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new Array[String](10) //10个元素的字符串数组,所有元素初始化为null val s= Array("Hello","World") //长度为2的Array(String) 类型是编译器推断出来的,已提供初始值就不需要new s(0) = "Goodbye" //Arr

快学Scala习题解答—第三章 数组相关操作

3 数组相关操作 3.1 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 random和yield的使用 Scala代码   import scala.math.random def randomArray(n:Int)={ for(i <- 0 until n) yield (random * n).toInt } println(randomArray(10).mkString(",")) 3.2 编写一个循环,将整数数组中相邻的元

第三章 数组的解剖学

C/C++的数组不同于VB等语言的数组,是有层次的,这个层次指的不是维度,而是象俄罗斯有名的套娃一样,一维套一维,亦即数组的嵌套,数组的元素也是数组,VB等语言的数组与之相比更像一个平面. 数组嵌套这个现象从其它语言的角度来看有点奇特,但其实原因也很简单.C/C++的对象模型并不视数组为某种数值的简单集合,而是对象的聚集,每个元素都是一个对象.元素为整数对象,就是整数数组,为浮点数对象,就是浮点数数组.然而,数组本身也是一种对象,因此一个数组也能作为另一个数组的元素.当某个一维数组以一维数组作为

scala学习第三章数组相关操作

val b = new ArrayBuffer[Int]() //或者 new ArrayBuffer[Int] b += 1 //ArrayBuffer(1) 用+= 在尾端添加元素 b += (1,2,3,5) //ArrayBuffer(1,1,2,3,5) 在尾端添加多个元素 b ++= Array(1,2,3) //ArrayBuffer(1,1,2,3,5,1,2,3) 在尾端追加集合 用++= b.trimEnd(5) //ArrayBuffer(1,1,2) 移除最后5个元素 b