[ACM]编程珠玑

项链截断算法

你有一条项链,它由 N 个随机排列的红、白和蓝色的珠子组成(3<=N<=350)。下面的例子展示了两条 N=29 时的项链:

             1 2                              1 2
           r b b r                           b r r b
          r         b                       b         b
         r           r                     b           r
        r             r                   w             r
       b               r                 w               w
      b                 b               r                 r
      b                 b               b                 b
      b                 b               r                 b
       r               r                 b               r
        b             r                   r             r
         b           r                     r           r
           r       r                         r       b
             r b r                            r r w
          Figure A                     Figure B
                        r red bead
                        b blue bead
                        w white bead
项链上的第一个和第二个珠子已经在图中标出了。

图 A 也可以用一个由 b 和 r 组成的字符串直接表示,b 代表蓝色而 r 代表红色,如下所示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb。

假设你想从项链的某处将它截断拉直;接着从一端向另外一端数收集同颜色的珠子,直到碰到一个不同颜色的珠子为止;然后再从另外一端做同样的操作。(一端收集的珠子颜色可以不同于另一端的。)

请想办法找到一个截断项链的位置,能够让我们尽量多地收集到同色的珠子。

例子

如图 A 中的项链,从第 9 和第 10 个或者第 24 和 第 25 个珠子中间截断,则我们可以收集到 8 个珠子。

图 B 中的项链有白色的珠子,当遇到白色的珠子时,它既可以作为蓝色的珠子看待,也可以作为红色的珠子看待,由收集珠子时的需求决定。包含有白色珠子的项链则会由 r、b 和 w 字符组成的字符串来表示。

请编写一个程序计算从某条项链中能够收集到多少个珠子。

输入格式

第一行: N,项链上珠子的个数

第二行:一个字符串,长度为 N,由 r、b 和 w字符组成

输入样例

29 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb

输出格式

输出一行字符,它应该包含了计算出的结果。

输出样例

11
测试输入帮助,input (新窗口) 期待的输出帮助,expectedoutput (新窗口) 时间限制帮助,timelimit (新窗口) 内存限制帮助,memlimit (新窗口) 额外进程帮助,nproc (新窗口)
测试用例 1 以文本方式显示
  1. 29↵
  2. wwwbbrwrbrbrrbrbrwrwwrbwrwrrb↵
以文本方式显示
  1. 11↵
1秒 1024KB 0

废话少说,上程序:
#include <stdio.h> #include <malloc.h> char s[200]; int Pearl(int n) { int i ,j ,left , k, max ,f = 1, w = 0, p = 0,m = 0; char c; i = j = max = left = 0; while (m < n) if (s[m++] != 'w') { c = s[m-1]; break; } if(m == n)//全是w,比如"wwwwwwwwwwwwwwwwwwwwwwwww" return n; while ((c == s[i] || s[i] == 'w') && i < n) { left++; i++; } if (i == n)//全是 一样的字符,比如"bbbbbbbbbbbbbbbbbbbbbb" { f = 0; i = 0; return left; } while (f) { c = s[i]; j = 0; w = i - 1 == -1 ? n-1 : i - 1; while(s[w] == 'w') { p++; w = (w - 1 == -1) ? n-1 : w - 1; } while (s[i] == c || s[i] == 'w') { f = (i == n-1) ? 0 : f; //i == n - 1表示已经处理到最后一个字符,把开关f关闭 i = (i + 1) % n; j++; } left += j; max = left > max ? left : max; left = j + p; p = 0; } return max; } int main() { int n,i,j; //freopen("in.txt", "r", stdin); while (scanf("%d",&n) != EOF) { scanf("%s",s); printf("%d\n",Pearl(n)); } }
提供几个测试例:
输入:
29
wwwbbrwrbrbrrbrbrwrwwrbwrwrrb
77
rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr
50
bbrrrbrrrrrrrrbrbbbrbrrbrrrrbbbrbrbbbbbrbrrrbbrbbb
17
wwwwwwwwwwwwwwwww
3
rrr
输出:
11
74
9
17
3

第一部分 编 程 技 术 第1章 性能监视工具 3 1.1 计算素数 3 1.2 使用性能监视工具 7 1.3 一个专用的性能监视工具 8 1.4 开发性能监视工具 10 1.5 原理 11 1.6 习题 11 1.7 深入阅读 12 第2章 关联数组 13 2.1 Awk中的关联数组 13 2.2 有穷状态机模拟器 16 2.3 拓扑排序 17 2.4 原理 20 2.5 习题 21 2.6 深入阅读 22 第3章 程序员的忏悔 23 3.1 二分搜索 24 3.2 选择算法 26 3.3 子程序库 28 3.4 原理 30 3.5 习题 31 第4章 自描述数据 33 4.1 名字—值对 33 4.2 记录来历 36 4.3 排序实验 37 4.4 原理 39 4.5 习题 39 第二部分 实 用 技 巧 第5章 劈开戈尔迪之结 43 5.1 小测验 43 5.2 解答 44 5.3 提示 44 5.4 原理 47 5.5 习题 48 5.6 深入阅读 49 5.7 调试(边栏) 49 第6章 计算机科学箴言集 51 6.1 编码 52 6.2 用户界面 53 6.3 调试 53 6.4 性能 54 6.5 文档 56 6.6 软件管理 56 6.7 其他 58 6.8 原理 58 6.9 习题 58 6.10 深入阅读 60 第7章 粗略估算 61 7.1 头脑热身 61 7.2 性能的经验法则 62 7.3 Little定律 64 7.4 原理 65 7.5 习题 66 7.6 深入阅读 67 7.7 日常速算(边栏) 67 第8章 人员备忘录 69 8.1 备忘录 69 8.2 原理 71 8.3 深入阅读 71 第三部分 人性化I/O 第9章 小语言 75 9.1 Pic语言 76 9.2 视角 79 9.3 Pic预处理器 81 9.4 用来实现Pic的小语言 83 9.5 原理 87 9.6 习题 88 9.7 深入阅读 89 第10章 文档设计 91 10.1 表格 92 10.2 三条设计原则 94 10.3 插图 94 10.4 文本 96 10.5 合适的媒介 98 10.6 原理 100 10.7 习题 101 10.8 深入阅读 101 10.9 次要问题目录(边栏) 101 第11章 图形化输出 103 11.1 实例研究 103 11.2 显示结果取样 105 11.3 原理 107 11.4 习题 108 11.5 深入阅读 110 11.6 拿破仑远征莫斯科(边栏) 110 第12章 对调查的研究 113 12.1 有关民意调查的问题 113 12.2 语言 114 12.3 图片 117 12.4 原理 119 12.5 习题 120 第四部分 算 法 第13章 绝妙的取样 123 13.1 取样算法一瞥 123 13.2 Floyd算法 124 13.3 随机排列 125 13.4 原理 127 13.5 习题 127 13.6 深入阅读 128 第14章 编写数值计算程序 129 14.1 问题 129 14.2 牛顿迭代 130 14.3 良好的起点 132 14.4 代码 133 14.5 原理 135 14.6 习题 135 14.7 深入阅读 137 14.8 数值算法的力量(边栏) 137 第15章 选择 141 15.1 问题 141 15.2 程序 142 15.3 运行时间分析 145 15.4 原理 148 15.5 习题 149 15.6 深入阅读 151 附录A C和Awk语言 153 附录B 一个子程序库 157 部分习题答案 165 索引 181
编程珠玑(programming pearls)最早刊登在communications of the ACM 杂志上,有个连载的专栏。文章从1983年到1987年,一共30篇。 目前的书籍<>就是作者在上述文章的基础上修改而成的。 然而,无论你是否阅读过这本书,阅读原始的文 章都将使你受益菲浅。因为如同优秀的论文一样,这一篇篇的文章自成体系,从问题的引入到启发性的解决思路,再到巧妙的解法,令人拍案称奇,难以忘怀。 一共有30篇文章: #ls -l -rwxr-xr-x 1 lh root 688955 2010-06-26 15:47 ABSTRACT DATA TYPES 1987.pdf -rwxr-xr-x 1 lh root 592362 2010-06-26 15:46 Aha algorithms 1983.pdf -rwxr-xr-x 1 lh root 544972 2010-06-26 15:37 algorithm design techniques 1984.pdf -rwxr-xr-x 1 lh root 1272082 2010-06-26 15:36 a literate program 1986.pdf -rwxr-xr-x 1 lh root 383303 2010-06-26 15:48 A SAMPLE OF BRILLIANCE 1987.pdf -rwxr-xr-x 1 lh root 736403 2010-06-26 15:26 a spelling checker 1985.pdf -rwxr-xr-x 1 lh root 621936 2010-06-26 15:41 associative arrays 1985.pdf -rwxr-xr-x 1 lh root 655322 2010-06-26 15:38 birth of a cruncher 1986.pdf -rwxr-xr-x 1 lh root 784014 2010-06-26 15:48 CONFESSIONS OF A CODER 1985.pdf -rwxr-xr-x 1 lh root 699274 2010-06-26 15:45 Cracking the oyster 1983.pdf -rwxr-xr-x 1 lh root 552332 2010-06-26 15:41 cutting the Gordian knot 1986.pdf -rwxr-xr-x 1 lh root 543033 2010-06-26 15:46 data structures programs 1983.pdf -rwxr-xr-x 1 lh root 786419 2010-06-26 15:42 Document design 1986.pdf -rwxr-xr-x 1 lh root 785751 2010-06-26 15:49 GRAPHIC OUTPUT 1984.pdf -rwxr-xr-x 1 lh root 311483 2010-06-26 15:37 how to sort 1984.pdf -rwxr-xr-x 1 lh root 619861 2010-06-26 15:43 literate programming 1986.pdf -rwxr-xr-x 1 lh root 1079682 2010-06-26 15:43 little languages 1986.pdf -rwxr-xr-x 1 lh root 270603 2010-06-26 15:35 little program, a lot of fun 1984.pdf -rwxr-xr-x 1 lh root 444133 2010-06-26 15:34 perspective on performance 1984.pdf -rwxr-xr-x 1 lh root 607158 2010-06-26 15:47 profilers 1987.pdf -rwxr-xr-x 1 lh root 632085 2010-06-26 15:29 selection 1985.pdf -rwxr-xr-x 1 lh root 426242 2010-06-26 15:46 self-describing data 1987.pdf -rwxr-xr-x 1 lh root 749141 2010-06-26 15:33 squeezing space 1984.pdf -rwxr-xr-x 1 lh root 573936 2010-06-26 15:39 than
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值