博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法练习 (二)
阅读量:6252 次
发布时间:2019-06-22

本文共 2232 字,大约阅读时间需要 7 分钟。

  上一篇做的题比较简单, 今天做了几题难度大了一些的题(可能很多人觉得还是很简单...我也得一步一步慢慢提高啊), 但是没有答案, 网上也没有找到答案. 所以不知道是对是错. 不过值得庆幸的是, 程序几乎没有Bug, 一次就运行出结果了, 只是不知道答案对错罢了. 希望各位博客园的园友们有兴趣帮小弟纠正纠正这些不好的算法:-)

  不知道为什么网上找的关于ACM的资料几乎都是用Pascal语言写的, 而我们学校要求是必须用C/C++写, 我也知道语言只是工具, 算法才是核心, 但我看到满篇的Pascal我还是没有耐心研读. 如果大家有什么好的关于<ACM试题和答案>, 并是用C/C++写的, 推荐给我哦:p

  下面暴露一下今天写的代码, 这两道题还有比较有意思的...第一题代码有什么不好的地方, 希望得到大家的批评和指点. 有兴趣做算法的, 也可以练练.

  还有, 我不知道像写C++这种控制台程序, 在代码里加上什么代码, 可以输出程序运行时间.

一、聪明的情侣

  酋长的女儿艾丽要出嫁了,按以往的风俗习惯,要搭个高台,台下是众多的求婚者,艾丽在台上扔束花,扔在台下谁身上,艾丽就得嫁给谁。但她担心落不到心爱的雷蒙身上。艾丽私下约雷蒙商量如何是好。雷蒙想出了一个主意……艾丽便和父亲说:“我不愿意搭台撒花,这么多人来,挤在一起乱哄哄的,没秩序。”父亲说,“不这样也可以,但结婚时要当场在人群中决定嫁给谁,不许指名,方法你自己定。”艾丽高兴的告诉主持人如何行事。婚日来临,人群拥挤,主持人叫求婚者排成一队,雷蒙在队外数了数队列共有101人,于是自己找了个合适的位置也站在队列中,主持人要大家从前往后1212……报数,报单数的退出场外,余下的人位置不变,再重新从前往后1212……报数,报单数的退场,如此下去最后只剩一人,艾丽便嫁给谁。大家惊奇的发现最后剩下的竟是雷蒙。请用程序回答雷蒙刚开始站在队列中的第几个位置。

  我的思路: 据题意, 算上雷蒙, 那应该是一共有102个男的来参加这个酋长女儿的"非诚勿扰"专场的, 我用了一个102个元素的Array数组,每个元素初始值都为1,表示都还没有被淘汰,以后淘汰了的用0表示, 用一个bool值来标记当前数组元素等于"1"的位置是单数还是双数(单数即为true). 循环数组里每一个的元素,当Array[i]==1的时候,进入一个判断,如果判断这个元素处在单数的位置,则把它的值改为0,这一个循环结束后,统计这102个元素的和,如果和为1的话,说明数组里只剩下一个人了, 然后输出这个人的位置(就是数组下标+1).循环多少次呢? 我用了一个do...while循环,当102个元素的和不为1的时候,循环. 

#include
<
iostream
>
using
 
namespace
 std;
int
 main()
{
    
int
 n;                            
//
这个数用来表示所有数组元素加起来的和
    
bool
 t 
=
 
false
;                    
//
用t标记此时的Array[i]是否为奇数位置的数
    
int
 Array[
102
];
    
for
(
int
 i 
=
 
0
; i 
<=
 
101
; i 
++
)
    {
        Array[i] 
=
 
1
;                
//
把数组102个元素都置为1,表示一开始都有资格参赛
    }
    
do
    {
        n 
=
 
0
;                        
//
将n清0
        
for
(
int
 i 
=
 
0
;i 
<=
 
101
; i 
++
)
        {
            
if
 (Array[i] 
==
 
1
)
            {
                t 
=
 
!
t;
                
if
(t 
==
 
true
)        
//
是奇数位置的话,就把Array[i]置为0,表示淘汰
                Array[i] 
=
 
0
;
            }
            n 
+=
 Array[i];
        }
        
if
(n 
==
 
1
)                    
//
n等于1了,说明数组中之剩下一个人还没有淘汰
        {
            
for
(
int
 i 
=
 
0
; i 
<=
 
101
; i 
++
)
            {
                
if
 (Array[i] 
==
 
1
)
                cout 
<<
 i
+
1
 
<<
 endl;    
//
输出这个人排的位置(因为数组从0开始下标的,所以要+1)
            }
        }
    }
while
 (n 
!=
 
1
);                
//
当数组中没有只剩下一个人的时候,执行循环
    
return
 
0
;
}

输出:

76

但我觉得这个结果是错的...不知道是不是这样...

二、最佳编码

  某通讯单位打算传递一段信息“XYZWYZWZYWYXZY,为提高安全性,打算将字母W,X,Y,Z分别用不同的0,1编码进行表示,并希望编码后,该段信息的编码总长度越短越好。请编写程序设计编码方案。

  我的思路: 我想用啊, 可是不知道怎么编写成代码.我想在代码中实现这样的功能: 输入字符串"XYZWYZWZYWYXZY", 回车, 然后程序输出用0,1表示的编码. 今天在网上看了很多,图书馆也找了不少数据结构的书,书上讲到哈夫曼编码也都只是介绍,没有详细的过程, 看了很久还是只编了一半...

  分析: X出现2次, W出现3次, Z出现4次, Y出现5次. 画出哈夫曼图...左子树用0表示, 右子树用1表示的话, 那么编码是X可以用000表示,W用001表示,Z可以用01表示,Y可以用1表示. 编码出来共是28位.(跟用00表示X,01表示Y,10表示Z,11表示Y,编码也是28位. 这仅是巧合).这题不晓得怎么下手,寻帮助.

hfm.png

  

继续练习算法...

转载地址:http://bpysa.baihongyu.com/

你可能感兴趣的文章
获取页面中所有dropdownlist类型控件
查看>>
【转自ITPUB】SYNONYM关于underlying table权限的小小发现
查看>>
halcon图像合并(贴图到指定位置)
查看>>
stark组件(2):提取公共视图函数、URL分发和设置别名
查看>>
android——使用Interceptor设置缓存来给服务器减负
查看>>
样式独立性的解决方案
查看>>
刷leetcode是什么样的体验?【转】
查看>>
linux内核数据结构之kfifo【转】
查看>>
c++学习笔记(新手学习笔记,如有错误请与作者联系)
查看>>
java集合复制和反转
查看>>
记录openlaw的反爬
查看>>
Matlab数据转化至python端,并写入数据库
查看>>
json字符串与json对象的相互转换
查看>>
APM最佳实践:Web 2.0和AJAX四大优化战略
查看>>
Java优先队列一些问题
查看>>
percona-toolkit 工具集安装
查看>>
mooc-IDEA 项目/文件之间跳转--002
查看>>
iOS的项目目录结构
查看>>
064:ORM查询条件详解-in和关联模型查询
查看>>
实现不在栈中产生对象
查看>>